Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > MDB - это просто


Автор: Domestic Cat 25.3.2005, 08:29
 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
 

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)