четверг, 24 апреля 2014 г.

Создание Веб Сервисов на Java EE с использыванием JAX-WS

maven
eclipse ide
apache tomcat

1 create maven project
2 setup dependencies
3 create web service interface
4 create implementation 

Общение с очередями через JMS


Общение с очередями через JMS

пятница, 9 сентября 2011 г. 
Задача: научиться получать и отправлять сообщения в очередь сообщений (Message Oriented Middleware).

С чем будем работать 

Для работы с очередями в Java используются следующие классы:

QueueConnectionFactory
 Фабрика подключений. Используется для получения Connection.

QueueConnection
Представляет собой подключение, необходимое для создание одной или более сессий работы с очередью.

QueueSession
Используется для создания таких объектов как: QueueReceiver, QueueSender, QueueBrowser, и TemporaryQueue.

Queue
Объект, инкапсулирующий имя очереди специфичное для провайдера. По сути представляет собой очередь, чтение или запись из которой должна быть произведена. 

QueueSender
 Используется для отправки сообщений.

QueueReceiver
Используется для получения сообщений.

Предварительные операции

Для отправки или получения сообщения необходимо создать объекты QueueReceiver или QueueSender соответственно. Последовательность вызовов объектов для этого следующая:

// 1) Получаем через JNDI менеджер подключений: 
QueueConnectionFactory qmanager = (QueueConnectionFactory)context.lookup("<Имя менеджера подключений>");

//  2) Получаем объект, представляющий очередь:
Queue queue = (Queue) context.lookup("<Имя очереди>"); 

// 3) Получаем и запускаем подключение: 
QueueConnection con =  qmanager.createQueueConnection();
con.start(); 

// 4) Начинаем сессию: 
QueueSession ses = con.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);

Особого внимания здесь требует метод createQueueSession. Первый его аргумент указывает, поддерживает ли подключение транзакции (если true, то значение второго аргумента игнорируется). Второй аргумент указывает кто из поставщика и клиента подтверждает, что сообщение получено. Приведенные в примере значения аргументов наиболее распространены.

 Теперь, когда в нашем распоряжении есть объект сессии, мы можем создать необходимый сервисный класс, готовый выполнить отправку, чтение или прием сообщения.

Отправка сообщений

// 1) Перед отправкой сообщения необходимо это сообщение создать:
javax.jms.TextMessage message = session.createTextMessage("<Текст сообщения>");

// 2) Создаем отправителя (queue - очередь, в которую должно быть отправлено сообщение):
sender = session.createSender(queue);

// 3) Отправляем сообщение:
 sender.send(message);

// 4) Для снятия всех блокировок и сохранения сообщений, отправленных в сессии, выполняем:
session.commit();


Прием сообщений

Для приема сообщений существует два способа:

Способ первый
 
// 1) Создаем получателя
QueueReceiver receiver = ses.createReceiver(queue);

// 2) Получаем сообщение
javax.jms.Message message = receiver.receive();

Недостаток этого метода в том, что сообщения в очереди может и не быть на момент вызова метода receive(). Тогда поток будет остановлен до появления сообщения.

Способ второй

Заключается в том, чтобы реализовать интерфейс javax.jms.MessageListener и передать его получателю (receiver). 

MessageListener listener = new MessageListener() {
 public void onMessage(Message message) {
  // Выполняются необходимые действия с сообщением
 }
};

receiver.setMessageListener(listener);

Интерфейс javax.jms.MessageListener предписывает реализовать всего один метод void onMessage(javax.jms.Message message). Как не трудно догадаться, этот метод вызывается получателем при получении сообщения (полученное сообщение передается в качестве аргумента метода), при этом выполнение потока не приостанавливается.

Напоследок 

Иногда удобнее создавать объекты, связанные с очередями в обход jms с помощью специфических API, таких как API предоставляемые IBM MQ. Но это тема отдельного поста.
- See more at: http://www.dokwork.ru/2011/09/jms.html#sthash.oRuYRgCR.dpuf

Работа с JMS сообщениями и MDB в JEE


Работа с JMS сообщениями и MDB в JEE tutorial

Работа с сообщениями подразумевает взаимодействие между компонентами системы посредством передачи сообщений. JMS позволяет реализовать это взаимодействие в java приложении, а MDB бины позволяют асинхронно обрабатывать получаемые сообщения на сервере приложений без дополнительных усилий по асинхронной обработке.

Ниже представлен простой пример обработки JMS сообщения с помощью MDB.


Немного теории

Для работы с сообщениями используется вспомогательное программное обеспечение, обычно входящее в поставку сервера приложений.
Компоненты системы могут посылать сообщения (producer) и получать их (consumer). Сообщение
отправляет producer на пункт назначения (destination), являющимся на сервере queue или topic, после чего consumer может забрать оттуда сообщение
В зависимости от того, какой тип имеет destination, разделяют две модели работы с сообщениями.

Первая модель — Point-to-Point

В случае если на сервере destination имеет тип queue, то сообщение, которое отправил producer, получает единственный consumer. Если на эту очередь сообщений подписано несколько получателей, то сообщение получит только один из них.

Вторая модель — Publish-subscribe

В случае если на сервере destination имеет тип topic, то одно сообщение может быть прочитано неограниченным количеством consumer, подписанных на этот на этот destination.

Структура JMS сообщения

Сообщение состоит из заголовка, поля свойств и тела.
Заголовок хранит мета информацию сообщения, заполняемую автоматически.
Поле свойств схоже с заголовком, но оно заполняется программно, и позже получатель сможет прочитать эту информацию.
Тело содержит полезную нагрузку сообщения. Тип нагрузки определяется при создании сообщения. Конкретные типы унаследованы от интерфейса javax.jms.Message

Создание очереди на сервере.

Для примера создадим topic на сервере. Использовать я буду glassfish 3.1.
Для начала создадим Connection Factory. Возможны несколько типов в зависимости от того, какой тип очереди сообщений будет использоваться.



Затем создаем destination с указание типа.



Создание отправителя сообщений

В данном случае producer будет находиться на сервере приложений. В случае если вам необходимо отправлять сообщения из отдельного клиента, то необходимо будет стандартным образом получить доступ к объектам по их JNDI имени из контекста.

//получаем ресурсы сервера для отправки сообщений
    @Resource(name="jms/TutorialPool")
    private ConnectionFactory connectionFactory;
    
    @Resource(name="jms/TutorialTopic")
    private Destination destination;

    public String getEnterString() {
        return enterString;
    }

    public void sendString(String enterString) {
        try {
            //создаем подключение
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();
            //добавим в JMS сообщение собственное свойство в поле сообщения со свойствами
            message.setStringProperty("clientType", "web clien");
            //добавляем payload в сообщение
            message.setText(enterString);
            //отправляем сообщение
            producer.send(message);
            System.out.println("message sent");
        //закрываем соединения
            session.close();
            connection.close();

        } catch (JMSException ex) {
            System.err.println("Sending message error");
            ex.printStackTrace();
        } 
  }


Message-Driven Bean

Для обработки приходящих сообщений на сервере мы будем использовать MDB.

Сообщения можно было бы получать и обрабатывать и с помошью pojo, выступающего как consumer. Но использование MDB позволит параллельно обрабатывать сообщения, не заботясь о сложности асинхронной обработки и дополнительного кода для подписки на очередь сообщений.
Асинхронная обработка реализуется через пул объектов, из которых на обработку сообщения сервер выделят объекты при необходимости.

Для реализации MBD достаточно унаследовать бин от интерфейса javax.jms.MessageListener, реализуя метод onMessage(), и аннотировать соответствующим образом класс.

Сделаем пример MDB, который выводит в консоль сервера информацию о поступившем сообщении.

@MessageDriven(
        //имя topic, на который подписан бин
        mappedName="jms/TutorialTopic",
        name = "ExampleMDB")
public class MDBExample implements MessageListener{
    
    
    //метод, вызываемый при получении нового сообщения
    @Override
    public void onMessage(Message msg) {
        try {
            TextMessage message = (TextMessage)msg;
            //считываем свойство из соответствующего поля, заданное вручную в consumer
            System.out.println("FROM MDB - client type IS " + message.getStringProperty("clientType"));
            //считываем  само сообщение
            System.out.println("FROM MDB - payload  IS" + message.getText());
        } catch (JMSException ex) {
            ex.printStackTrace();
        }
    }
    
}


В onMessage метод добавляется необходимая бизнес логика, в зависимости от типа сообщения, его содержания и тд.
При необходимости, для ручной обработки сообщений можно самостоятельно создать обработчика.
Например так:

    @Resource(name="jms/TutorialPool")
    private ConnectionFactory connectionFactory;
    
    @Resource(name="jms/TutorialTopic")
    private Destination destination;
    
    void onMessage(){
        try {
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageConsumer consumer = session.createConsumer(destination);
            connection.start();
            while(true){
                Message msg = consumer.receive();
                //обработка сообщения
            }
          //закрыть connection  
        } catch (JMSException ex) {
            ex.printStackTrace();
        }
        
    }


Для более подробного изучения JMS и EJB в целом, могу рекомендовать книги:

язык scala

scala sdk
scalable language based on java
maven with scala plugin
на scala написан движок твитера
данный язык используется в интеграторах

scala supported ide
1 intelli j idea  - best scala support
2 netbeans
3 eclipse

OO language

классы трейды

среда, 23 апреля 2014 г.

weblogic способы обмена информацией

общая архитектура Oracle WEBLOGIC 
----------------------------------------------------------------
SOAP  - тормозный протокол
corba IIOP  - старый
java RMI  - обмен между джава машинами  быстрый
JAAS - джава сервис авторизации и аутентификации
пул соединений weblogic
JPA правила ORM - реализация в weblogic ( toplink \ eclipse link )

---------------------------------------------------------
механизмы управления транзакциями в вебложике
java transaction api  JTA
java transaction services JTS
----------------------------------------------------
jtimer -sheduler for works
-----------------------------------------------------
java messages services  - async messages  mechanics
------------------------------------------------------
EJB container
WEB container
-----------------------------------------------------
JNDI - обеспечивает публикацию имен
-----------------------------------------------------

domain
admin server

jrockit 

Курс лекций: JV_4 Разработка Сервис Ориентированных приложений (SOA)

 Курс лекций: JV_4 

Разработка Сервис Ориентированных приложений (SOA) 
 c использованием средства разработки Oracle JDeveloper и сервера приложений Oracle iAS 6 дней (48 часов)
На современном этапе развития программного обеспечения уделяется особое внимание созданию надежных, масштабируемых и...
Смотреть больше

 

На современном этапе развития программного обеспечения уделяется особое внимание созданиюнадежных, масштабируемых и переносимых приложений, которые не зависят от поставщиков и платформ.Компании, поставляющие готовые решения – SAP, Oracle, HP и многие другие, в настоящий моментуделяют большое внимание взаимодействию между своими приложениями посредством WEB сервисов.На смену технологиям Borland MIDAS и другим, приходят новые, обеспечивающие надежностьвзаимодействия готовых решений внутри корпорации. Это в первую очередь архитектура, ориентируемаяна сервисы со своей технологией SOAP. В этом курсе будут рассмотрены основы создания распределенных приложений, основанные на Web сервисах, с помощью продукта Oracle Jdeveloper, длясерверов приложений стандарта JEE. С помощью “оркестровки ” WEB сервисов, с использованием языкаBPEL, в одну корпоративную задачу будут собраны различные службы, поставляющие данные из различных бизнес процессов. Использование языка UML позволит наглядно отобразить взаимодействиемежду процессами масштаба предприятия.Аудитория: Начинающие разработчики WEB серверных приложений и приложений в архитектуре SOA.Бизнес аналитики, интеграторы, разработчики Xbase, переводящие свои приложения на платформу распределенных вычислений.Для решения поставленных задач будут использоваться средства разработки Oracle Jdeveloper Необходимая подготовка: реляционные базы данных Знания ООП, язык программирования Java, основныекомпоненты технологии JEE.Задача: показать на примерах возможности построения сервис ориентируемых систем с использованиемсовременных средств разработки. Приложения не должны зависеть от платформ, средств разработки, онидолжны быть настраиваемы, масштабируемы, надежны. Взаимодействие с готовыми решениями (SAP, HP,Oracle) – основная задача интеграторов предприятий. Слушатели получат методики доступа к различнымсерверам базы данных с использованием технологий JEE – EJB. Разрабатывается SOAP приложение споставкой Web сервисов, а также клиентские места для доступа к стандартным серверам приложенийтехнологии JEE. Оркестровка WEB сервисов осуществляется с помощью Oracle BPEL Designer.Интеграция приложений показана на примерах Oracle Portal c созданием Omni WEB сервис портлетов.
Программа курса:
1.
Обзор распределенных вычислений. Web-сервис – это просто еще одна программа,выполняющаяся в недрах вашей вычислительной инфраструктуры. Web-сервисы – этотехнология работы с сообщениями, в которой и передача сообщений основана на XML.Ключевые функций, которые применяются для управления Web-сервисами. В их числе - развертывание, конфигурирование и обеспечение безопасности. SOA не является чем-то новым:IT-отделы компаний успешно создавали и развертывали приложения, поддерживающие сервис -ориентированную архитектуру, уже много лет - задолго до появления XML и Web-сервисов. SOA- это не технология, а способ проектирования и организации информационной архитектуры ибизнес функциональности.
2.
Открытые стандарты группы W3C. XML – основа обмена данными между приложениями.Краткое введение в XML. Понятие DOM, XSD, механизмы разбора документов. Визуальноепостроение схемы XSD. Разбор документов Java приложениями и средствами сервера базыданных Oracle. Загрузка схемы XSD в базу данных. Формирование объектно – реляционноймодели в базе данных. Использование протокола WebDAV для загрузки документов в хранилище
данных. Связывание XML данных с объектами java, стандарты JAXB 1, JAXB 2. Marshaller иUnmarshaller данных.3.Разработка и развертывание приложений в среде Oracle Application Server (Weblogic) . Файлы web.xml,war, ear. Последовательность сборки и отправки приложений на сервер. Формированиемногомодульных приложений. Разработка приложений для доступа к данным – стандарт EJB 3.Использование технологии Oracle ADF для быстрой разработки модулей доступа к данным – DataControl и DataBinding файлы.4.Стандарты SOAP, WSDL, UDDI. RPC-стиль. Стиль Document . Обзор стандартов. Визуальноепостроение файла интерфейса WSDL. Основные блоки WSDL файла. Создание сообщений иформирование параметров. Описание операций, видов связывания и точек размещения сервисов.5.Использование WSI анализатора. Инсталляция анализатора в среде Oracle JDeveloper. Анализсозданного WSDL документа. Обнаружение и исправлении ошибок в описании интерфейса WSDL.6.Разработка и размещение на сервере Web сервиса, полученного в результате компиляции WSDLфайла. Заглушка и скелет сервиса. Особенности размещения сервиса в контейнере OC4J.7.Разработка и развертывание веб-сервисов, реализованных как классы и интерфейсы Java.Автоматическое формирование WSDL файла из Java интерфейса. Доступ к домашней странице веб-сервисов OracleAS. Передача параметров сервису из Web интерфейса, анализ нагрузки на сервис,формирование AJAX скрипта для доступа к сервису из динамических HTML – AJAX страниц. Вызоввеб-сервиса в приложении клиента. Генерация файла-заглушки и вызов веб-сервиса. Политикабезопасного доступа к методам сервиса.8.Понимание протокола SOAP (Simple Object Access Protocol, простой протокол доступа к объектам). Насамом деле ли он такой простой? Сообщение протокола SOAP. Типы сообщений протокола 

SOAP.Использование различных методов упаковки данных в конверт SOAP.


9. Подготовка пакета Oracle для публикации в качестве сервиса. Отображение типов данных OracleSQL и PL SQL на методы сервиса. Формирование WSDL файла на основе описания процедур ифункций в пакете Oracle. Использование JDBC и SQLJ стандарта для доступа к хранимымпроцедурам Oracle. Класс – заглушка, сформированный автоматически средствами OracleJDeveloper. Основы использования Java в базе данных. Загрузка в Oracle Java классов для доступаиз базы данных к Web сервисам. Формирование запросов к сервисам из SQL и PL SQL – Oracleбаза данных - клиент для сервера приложений. Управление \
безопасностью для доступа из базыданных к серверу приложений.
10.Использование технологии EJB 3 для формирования Web сервиса. Еще одно клиентскоепредставление для сессионного EJB компонента – web сервис клиент. Использование фасадныхметодов EJB для публикации в качестве операций. Обеспечение безопасного доступа к выполнениюметодов через web сервис интерфейс. Сущностные бины для взаимодествия с данными.
11.SOA "подталкивает" к использованию альтернативных технологий и подходов (таких как обменсообщениями) для построения приложений посредством связывания сервисов, а не посредствомнаписания нового программного кода. Потребление веб-сервисов стиля Document в среде OracleJDeveloper. Java API для доступа к службам сообщений (JMS). Веб-сервисы JMS. Разработка MDBкомпонент и управление ими через службы JMS сервера приложений. Асинхронныое выполнениезаданий через сервисы. Передача простых и объектных сообщений из сервиса в MDB компоненты. Управление службой JTimer через опубликованные сервисы на сервере приложений.
12. Разработка клиентских приложений в других языках приложения. Встраивание вызова сервиса встатические HTML страницы, JSP и JSF приложения. (AJAX) Доступ к сервисам из продуктовMicrosoft. VBA – пользователь сервисов.
13. До появления концепции SOA при разработке систем в качестве отправного момента дляпрограммирования бизнес логики использовались диаграммы рабочих потоков и блок-схемысистем. Разработанные вручную программы тщательно тестировались, после чего внедрялись.Сегодня ситуация изменилась коренным образом: современные инструменты управления бизнес-процессами позволяют обойтись без ручной разработки и тестирования. Так, с помощью методовмоделирования можно проверять корректность исполнения бизнес логики, представленной вдиаграммах, а затем автоматически получать описания этих диаграмм на XML-языкахуправления бизнес-процессами. Таким средством является язык BPEL
Обмен синхронными и асинхронными сообщениями. Обработка исключений. Общая архитектураBPEL PM. BPEL Designer на базе среды разработки JDeveloper. Инсталляция, конфигурация, начало работы. Конфигурация Oracle BPEL консоли. Запуск сервера и дизайнера. Порядок создания простогоBPEL процесса – “HelloWorld”. Конфигурация WSDL интерфейса для BPEL процесса. Конфигурациябазового скелетона для процесса. Использование утилиты ANT для сборки и размещения процесса насервере приложений. Настройка build файла для отправки приложения на сервер 15.Оркестровка сервисов с помощью BPEL. Поддержка моделирования BPEL-процессов в средеJDeveloper. Импорт XML-схем и WSDL-локаторов. Поддержка проверки правильности, развертыванияи управления жизненным циклом. Синхронные и асинхронные процессы16.Усовершенствование BPEL-процессов: параллельная обработка и условные переходы. Обработка впараллельных   потоках. Ветвление с параллельным выполнением процессов. Условное ветвление.Формы уведомления17.Повышение надежности процессов, используя средства обработки ошибок и управленияисключительными ситуациями. Определение событий. Конфигурирование тайм-аутов. Обработкаошибок. Перехват исключительных ситуаций. Управление компенсирующими операциями. 
18. Включение в BPEL-процессы сервисов трансформаций. Сервис и инструмент трансформаций.Пакетирование трансформаций. Стандартные, пользовательские и расширенные функции.Тестирование и анализ отображения. Генерация XML-экземпляра. Инструмент XSLT Mapper. 
19.Вызов BPEL-сервисов через адаптеры. Среда адаптеров, основанная на стандартах. Выбор сервисаадаптера. Конфигурирование адаптера файлов. Поддерживаемые и связываемые адаптеры.Интегрированная среда адаптеров. Адаптер Oracle Applications. Вызов в BPEL-процессе адаптерафайлов как сервиса. Вызов в BPEL-процессе адаптера базы данных как сервиса. Добавление обработкиисключительных ситуаций в системе базы данных. Добавление операции цикла While. Добавлениеветви обработки исключительных ситуаций для операции области действия Scope. Добавлениеоперации ожидания Wait 
20.Администрирование и мониторинг BPEL-процессов. BPEL-консоль. Управление жизненным цикломBPEL-процесса. Администрирование диспетчера BPEL Process Manager.
 21.Интеграция Java-приложений и BPEL-процессов. Оперативное встраивание Java-кода. Интеграция всреде вызова веб-сервисов WSIF (Web Services Invocation Framework). Вызов BPEL-процесса из JSP-страниц, среды JavaServer Faces (JSF) и интегрированной среды разработки приложений ADF.Включение Java/J2EE-сервисов в BPEL-процесс. Развертывание JCA-адаптера и его использование вBPEL-процессе. Реализация веб-сервиса как BPEL-клиента. Реализация в BPEL-процессе компонента,управляемого сообщениями, для организации асинхронного обмена сообщениями. 
22.Определение правил для операции создания параллельных ветвей FlowN и использование этойоперации. Вызов различных сервисов в зависимости от входных данных пользователя или критериеввыбора. Связующие наборы. Реализация связующих наборов и операций обработки тайм-аутовonAlarm. 
23.Конфигурирование корпоративной сервисной шины ESB. Архитектура и компоненты шины ESB.Топологические опции шины ESB. Сервис-ориентированная архитектура и управляемая событиямиархитектура EDA (Event-Driven Architecture) в среде шины ESB. Конфигурирование шаблоновподключений в среде шины ESB. Преимущества шины ESB. Интеграция шины ESB с компонентамисервис-ориентированной архитектуры 
24.Создание и маршрутизация сообщений в среде шины ESB. Работа с конструктором ESB Designer всреде Oracle JDeveloper. Спецификация правил маршрутизации. Создание сервисов трансформацийсодержимого сообщений. Спецификация (в среде Oracle JDeveloper) Xpath-выражений для правилмаршрутизации. Представление ESB-сервисов для внешних ссылок как WSDL-сервисов. ИнтеграцияESB-сервисов с BPEL-процессом. Управление жизненным циклом ESB-проекта.
 25.Управление ESB-компонентами с помощью инструмента ESB Control. Доступ к инструменту ESBControl. Управление ESB-приложением. Тестирование ESB-сервисов. Протоколирование ESB-сервисов