Message Driven Beans на jBoss
1. Задача: создать Message Driven Bean (MDB) на jBoss и протестировать его.
2. Я пользовался самой последней версией jBoss и SDK 1.4.
3. Запускаем jBoss. Прежде всего нужно зайти в ${JBOSSHOME}/ Server/default/deploy/jms, и в файле jbossmq-destinations-service.xml в самом первом mbean исправить строку
| Код | <role name="publisher" read="true" write="true" create="false"/>
|
на
| Код | <role name="publisher" read="true" write="true" create="true"/>
|
Далее запускаем run.**.
4. Пишем MDB. Структура директории такая:
| Код | .. META-INF/ jboss.xml ejb-jar.xml example/ MDB.java MDBClient.java
|
5. MDB.java
| Код | package example;
import javax.ejb.*; import javax.jms.*;
public class MDB implements MessageDrivenBean, MessageListener { protected MessageDrivenContext ctx; public void setMessageDrivenContext(MessageDrivenContext c) { this.ctx = c; } public void ejbCreate() { } public void onMessage(Message msg) { if (msg instanceof TextMessage) { TextMessage tm = (TextMessage) msg; try { String text = tm.getText(); System.out.println("[RECEIVED MESSAGE] " + text); } catch (Exception e) { e.printStackTrace(); } } } public void ejbRemove() { } }
|
Он предельно прост. Методу onMessage передается TextMessage, из которого извлекается текст и печатается в консоль сервера.
6. ejb-jar.xml
| Код | <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" version="2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/nsj2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>MDB</display-name> <enterprise-beans> <message-driven> <ejb-name>MDB</ejb-name> <ejb-class>examples.MDB</ejb-class> <messaging-type>javax.jms.MessageListener</messaging-type> <transaction-type>Container</transaction-type> <message-destination-type>javax.jms.Topic</message-destination-type> <activation-config> <activation-config-property> <activation-config-property-name> destinationType </activation-config-property-name> <activation-config-property-value> javax.jms.Topic </activation-config-property-value> </activation-config-property> </activation-config> </message-driven> </enterprise-beans> </ejb-jar>
|
Как видим, бин подписан на топик.
7. jboss.xml
| Код | <jboss> <enterprise-beans> <message-driven> <ejb-name>MDB</ejb-name> <destination-jndi-name>topic/testTopic</destination-jndi-name> </message-driven> </enterprise-beans> </jboss>
|
jboss.xml - специфический для провайдера (jBoss) файл, который указывает на топик, на который подписан наш бин. Это тестовый топик, см. jbossmq-destinations-service.xml.
8. Компилим, предварительно установив CLASSPATH (на винде нужен SET): export CLASSPATH=:.:/jboss/client/jboss-j2ee.jar:/jboss/client/jbossall-client.jar
Пакуем бин: jar cf MessageBean.jar *
9. Кидаем в директорию server/default/deploy
10. Здесь сервер должен сказать, что бин deployed.
11. Пишем клиента.
| Код | import examples.*; import javax.naming.*; import java.util.*; import javax.jms.*;
public class MDBClient { public static void main(String[] args) throws Exception { Hashtable h = new Hashtable(); h.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); h.put(Context.PROVIDER_URL, "jnp://localhost:1099"); h.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(h); TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("java:/XAConnectionFactory"); TopicConnection conn = factory.createTopicConnection(); TopicSession session = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = (Topic) ctx.lookup("topic/testTopic"); TopicPublisher publisher = session.createPublisher(topic); TextMessage msg = session.createTextMessage(); msg.setText("I'll meet you at midnight, Under the moonlight"); publisher.publish(msg); } }
|
Здесь ничего особенного нет. Клиент - паблишер для топика, он идет по стандартной JMS схеме : найти TopicConnectionFactory -> создать соединение -> создать сессию -> создать паблишера для нужного топика -> создать мессагу -> опубликовать ее. параметры jndi - стандартные для jBoss, параметры для нахождения TopicConnectionFactory и topic сидят в файле server/default/deploy/jms/jms-ds.xml.
12. Компилим и запускаем клиента. Сервер выдаст вот что: 10:14:14,957 INFO [STDOUT] [RECEIVED MESSAGE] I'll meet you at midnight, Under the moonlight
|