Пример приложения использующего JMS и MDB Передача корпоративных сообщений становятся все более и более важным компонентом для свободного объединения корпоративных фреймворков. Это проявилось в большей части как быстрое увеличение роста корпоративных приложений и несоизмеримых корпоративных ресурсов наряду с растущей потребностью объединения этих приложений в связанные системы. За эти годы Сообщения и Ориентированные на сообщения связующие ПО (Message Oriented Middleware (MOM) ) научились предоставлять эту возможность собственными средствами. Введение в Java Messaging Service (JMS), как в стандарт, устраняет много неудобств в использовании собственных средств MOM. В дополнение Message Driven Beans(MDBs) представляют вместе с Enterprise Java Beans 2.0 обеспечение наилучшего из существующих вложений в J2EE сервера приложений. Некая компания, в этом примере занимается розничной и оптовой продажей товаров различных категорий. Все размещенные заказы в заявке должны быть одобрены продающим персоналом перед предоставлением их заказчику. Для оптовой торговли, компания разместила своих агентов по всей стране. Они отсылают заказы по несколько штук, как только потребуется необходимое количество груза. Конечные пользователи для оформления заказов используют веб-сайт компании, в то время как агенты управляют отправкой грузов с помощью специального ПО установленного на их рабочих местах. Все отправки товаров должны быть одобрены главным менеджером компании перед их передачей заказчику. Это типичное приложение, использующее jms, как решение, поскольку грузы в заказе обрабатываются в асинхронном порядке. После прочтения данной статьи, вы будете способны определять очереди сообщений и их фабрики соединений в Geronimo/ActiveMQ среде окружения, посылать и принимать сообщения, использую различные типы заявок в вашем распределенном приложении. Эта статья состоит из следующих разделов. Краткий обзор JMS в среде Geronimo/ActiveMQ . Краткий обзор приложения. Конфигурация, разработка и развертывание простого приложения. Тестирование простого приложения. * Заключение Беглый обзор JMS в Geronimo/ActiveMQ окружении Сервер Geronimo поставляется с компонентами JMS сервера приложений, которые могут получать доступ к JMS ресурсам как к фабрике соединений, частям и очередям в ней. JMS сервер также известен как брокер (посредник) сообщений. По умолчанию брокер сообщений поддерживается Geronimo в помощью ActiveMQ, обычно не нужно даже вносить никаких изменений, с тех пор как сервер стал зрелым и многофункциональным JMS продуктом. Данная реализация использует встроенную базу данных Derby для постоянного представления сообщений. ActiveMQ поддерживает большое количество протоколов (таких как TCP, SSL, UDP, групповая передача, intra-JVM и NIO) и взаимодействий с клиентом. В контексте Geronimo ActiveMQ поддерживает MDBs, которые являются EJB использующими JMS-сообщения. Это позволяет JMS-приложению использовать специфические возможности J2EE для Geronimo и компонентов приложения, таких как JSP, сервлеты и EJB использующие JMS. Geronimo реализует это JMS API через абстрактный слой для поддержки любого JMS провайдера. Эта способность достигается поддержкой J2EE спецификации коннектора (JCA). JCA 1.5 спецификация обеспечивает взаимоотношения между сервером приложений и драйвером ActiveMQ (адаптером ресурсов). Приложения развертываемые на Geronimo получают доступ к брокеру ресурсов ActiveMQ только через адаптер ресурсов (RA). Обзор приложения. Процесс работы приложения определяется двумя очередями сообщений для сохранения заказов и доставки грузов. Ответ на заказ должен быть сгенерирован и отослан посредством корпоративного веб-приложения. Когда ответ на заказ отослан в очередь заказов, MDB будет его обрабатывать. Это перенесет заказ на следующий уровень системы обработки заказов, для сохранения их на сервере. Эти сохраненные заказы будут обработаны сотрудниками компании позже. Торговые агенты компании используют приложение отправки грузов для отправки грузов (по подшивке заказов) по местам назначения. Сперва они готовят отгрузку как XML файл, и затем передают его приложению как параметр. Приложение отправки грузов должна прочесть содержимое этого XML файла (с запросом груза) и отправить его в очередь отправки грузов. Главный менеджер компании используя приложение отправки грузов находит все запросы на отгрузку. Когда груз отправлен в очередь отправки грузов, приложение закачивает все запросы на компьютер главного менеджера. Он их одобрит и вручную отправит в дальнейшую обработку. Структура приложения Ядро приложения размещения заказов должно быть развернуто как EAR на сервере приложений. Обзор структуры EAR дан в следующем описании. |-Order.ear |- geronimo-activemq-ra-2.0-SNAPSHOT.rar |- jms-mdb-sample-ejb-2.0-SNAPSHOT.jar |-META-INF |- openejb-jar.xml |- jms-mdb-sample-ejb-2.0-SNAPSHOT.war |- index.jsp |- error.jsp |- WEB-INF - web.xml |- classes |- META-INF |- application.xml |- geronimo-application.xml MDB Implementation Message-Driven Bean использует аннотацию @MessageDriven для замены объявления этого MDB в файле ejb-jar.xml. OrderRecvMDB.java // //MessageDrivenBean слушает пункты // 'OrderQueue' очередь и процесс соответственно // @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue="OrderQueue") }) public class OrderRecvMDB implements MessageListener{ private static final String ORDER_MGMT_INFO = "order_mgmt.properties"; private static final String ORDER_REPO = "order.repo"; public OrderRecvMDB() { } public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("Order Received \n"+ textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } В данном приложении очередь заказов будут обрабатывать MDB. openejb-jar.xml сообщает Geronimo с какими группами ресурсов ассоциируется MDB. Эта связь OrderRecvMDB с очередью заказов OrderQueue, осуществляется с помощью CommonConnectionFactory. openejb-jar.xml ${pom.groupId} ${pom.artifactId} ${version} jar org.apache.geronimo.configs activemq-broker car ejb-name>OrderRecvMDB jms-resources geronimo-application.xml и application.xml определяют главне компоненты приложения EAR. Оба EAR компонента и информация о веб-архиве обычно берется из этих файлов. Файл geronimo-application.xml обычно включает секции для для определения JMS очередей и общих фабрик соединений для доступа к ним. Это используется для разворачивания geronimo-activemq-ra.rar включенного в EAR. geronimo-application.xml ${pom.groupId} ${pom.artifactId} ${version} ear geronimo-activemq-ra-2.0-SNAPSHOT.rar ${pom.groupId} jms-resources ${version} rar org.apache.geronimo.configs activemq-broker car jms-resources DefaultWorkManager javax.jms.ConnectionFactory CommonConnectionFactory javax.jms.QueueConnectionFactory javax.jms.TopicConnectionFactory javax.jms.Queue org.apache.activemq.command.ActiveMQQueue OrderQueue OrderQueue javax.jms.Topic org.apache.activemq.command.ActiveMQTopic application.xml Geronimo Sample EAR for jms-mdb-sample Geronimo Sample EAR for jms-mdb-sample geronimo-activemq-ra-2.0-SNAPSHOT.rar jms-mdb-sample-ejb-2.0-SNAPSHOT.jar jms-mdb-sample-war-2.0-SNAPSHOT.war /order Client Implementation OrderSenderServlet.java будет парсить веб-форму, создавать сообщение и отсылать его в очередь сообщений посредством CommonConnectoryFactory. Пожалуйста запомните, что Geronimo игнорирует атрибут конфигурации 'mappedName' для аннотации @Resource. Вместо него используйте в аннотации атрибут 'name'. OrderSenderServlet.java public class OrderSenderServlet extends HttpServlet { @Resource(name="CommonConnectionFactory") private ConnectionFactory factory; @Resource(name="OrderQueue") private Queue receivingQueue; public void init() throws ServletException { super.init(); } protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { manageOrders(req,res); } protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req,res); } private void manageOrders(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ String path = "/error.jsp"; Connection connection = null; MessageProducer messageProducer = null; Session sess = null; try { String customerId = req.getParameter("customerId"); String orderId = req.getParameter("orderId"); String qty = req.getParameter("quantity"); String model = req.getParameter("model"); if(!customerId.equals("") && !orderId.equals("") && !qty.equals("")){ System.out.println("Start Sending Order Request"); // creating online order request String orderRequest = "" ; connection = factory.createConnection(); sess = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); path = "/index.jsp"; TextMessage msg = sess.createTextMessage("" ); messageProducer = sess.createProducer(receivingQueue); messageProducer.send(msg); System.out.println("Order Request Send"); } else{ String error = ""; if(customerId.equals("")){ error = "Customer Id Cannot be Empty"; }else if(orderId.equals("")){ error = "Order Id Cannot be Empty"; }else if(qty.equals("")){ error = "Quantity Cannot be Empty"; } req.setAttribute("error",error); } } catch (Exception e) { System.out.println("Error "+e); e.printStackTrace(); } finally { try { if(messageProducer != null) messageProducer.close(); if(sess != null)sess.close(); if(connection!= null)connection.close(); } catch (JMSException e) { e.printStackTrace(); } } getServletContext().getRequestDispatcher(path).forward(req,res); } } web.xml of the archive has the relevant configurations for the both queue connection factory and the queue, which is essential to refer to resources in a local enviroment. web.xml JMS Servlet Sample OrderSenderServlet org.apache.geronimo.samples.order.OrderSenderServlet 0 OrderSenderServlet /order CommonConnectionFactory javax.jms.QueueConnectionFactory Container Shareable OrderQueue javax.jms.Queue Produces OrderQueue /index.jsp Please note that this web application supports Servlet 2.5 specification. Some of the configurations in older versions (2.4) are slightly different than given in the above web.xml. geronimo-web.xml is not necessary in this case as the annotations will help resolve the queue or connection factory references. Используемые инструменты Инструменты используемые для разработки и сборки распределённых приложений: Apache Maven 2 Maven is a popular open source build tool for enterprise Java projects, designed to take much of the hard work out of the build process. Maven uses a declarative approach, where the project structure and contents are described, rather than the task-based approach used in Ant or in traditional make files, for example. This helps enforce company-wide development standards and reduces the time needed to write and maintain build scripts. The declarative, lifecycle-based approach used by Maven 1 is, for many, a radical departure from more traditional build techniques, and Maven 2 goes even further in this regard. Maven 2 can be download from the following URL: http://maven.apache.org конфигурация, сборка и развёртывание этого приложения Download the order processing application from the following link: jms-mdb-sample После распаковки данного файла будет создана директория jms-mdb-sample. Исходный Код Получить исходный код примера можно из SVN: svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/jms-mdb-sample Building The jms-mdb-sample folder will already contain an ear file ready to be deployed. However, you can still play with the source and build it yourself. Use a command prompt to navigate into the jms-mdb-sample directory and just give mvn install site command to build. It will overwrite the jms-mdb-sample-ear-2.0-SNAPSHOT.ear under the jms-mdb-sample folder. Deploying Deploying Order processing sample application is pretty much the same as the deployment of JMS resources. 1. Navigate to Deploy New from the Console Navigation panel. 2. Load jms-mdb-sample-ear-2.0-SNAPSHOT.ear from jms-mdb-sample folder in to the Archive input box. 3. Press Install button to deploy application in the server. Testing of the Sample Application To test the sample web application open a browser and type http://localhost:8080/order. It will forward you in to the Order Management Welcome page. Then user has to fill the necessary information for the order placement and submit it. After processing an order you will see the message printed to your console. Summary This article has demonstrated the use of JMS features in Apache Geronimo with the ActiveMQ JMS server. It provides a hypothetical example which extensively used JMS features. Some of the highlights of this article : - * Define JMS connection factories and related queues in a Geronimo enviroment. * Message Driven Beans are the components listening on JMS queues providing by the J2EE container. ------------------------------------------------------------------------------- http://translated.by/you/jms-and-mdb-sample-application/into-ru/trans/ Original (English): JMS and MDB sample application (http://cwiki.apache.org/GMOxDOC20/jms-and-mdb-sample-application.html) Translation: © pvito, xtsidx, krolser. translated.by crowd