Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDB - это просто 
:(
    Опции темы
Domestic Cat
Дата 23.3.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



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


ЗЫ. Если не работает - сообщайте, мог ошибиться т.к. писал по памяти.


--------------------

PM   Вверх
Sardar
Дата 23.3.2005, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Немного не ясно как клиент общается с сервером. По особым протоколам, на особых портах, которые скоре всего закрыты файрволом или как?
И воторе, можно ли отсылать бинарники, т.е. что то типа BinaryDataMessage? Звыняюсь в ман не полез... smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Domestic Cat
Дата 23.3.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата
Немного не ясно как клиент общается с сервером. По особым протоколам, на особых портах, которые скоре всего закрыты файрволом или как?


Вот тут и протокол, и порт smile

Цитата
jnp://localhost:1099


Цитата
И воторе, можно ли отсылать бинарники, т.е. что то типа BinaryDataMessage? Звыняюсь в ман не полез.


JMS определяет такие мессаги:
TextMessage, BytesMessage, StreamMessage, ObjectMessage, MapMessage


--------------------

PM   Вверх
jer1
Дата 30.3.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: 1
Всего: 5



а где это можно применить, несколько примеров, где это оправдано
--------------------
:w!q
PM MAIL   Вверх
Domestic Cat
Дата 30.3.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Там, где применяется MOM - Message Oriented Middleware, короче говоря, везде. Фактичecки, это то жe самое, что и RMI / TCP/IT/ датаграммы, только kоммуникация асинхронна, плюс необязательно чтобы работал получатель - в этом случае сервер сохраняет мессаги и передает получателю впоследствии.


--------------------

PM   Вверх
YuG
Дата 6.3.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



Сделал всё по инструкции...

Вот тут, у клиента:
Код

TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("java:/XAConnectionFactory");


вот так ругается:
Код

javax.naming.NameNotFoundException: XAConnectionFactory not bound
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:491)
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:499)
    at org.jnp.server.NamingServer.getObject(NamingServer.java:505)
    at org.jnp.server.NamingServer.lookup(NamingServer.java:278)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
    at javax.naming.InitialContext.lookup(InitialContext.java:347)
    at test.jms.MDBClient.main(MDBClient.java:38)
Exception in thread "main" 


Что не так?

Это сообщение отредактировал(а) YuG - 6.3.2006, 17:50
PM WWW ICQ Skype   Вверх
Tony
Дата 7.3.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Цитата(Domestic Cat @ 30.3.2005, 18:52)
Там, где применяется MOM - Message Oriented Middleware, короче говоря, везде. Фактичecки, это то жe самое, что и RMI / TCP/IT/ датаграммы, только kоммуникация асинхронна, плюс необязательно чтобы работал получатель - в этом случае сервер сохраняет мессаги и передает получателю впоследствии.

А не прощели написать сервлет.Скачать jakarta HttpClient i посилать всё 4то угодно(взависимости от сервлета) smile


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
chief39
Дата 7.3.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Цитата(Tony @ 7.3.2006, 19:35 Найти цитируемый пост)
А не прощели написать сервлет.Скачать jakarta HttpClient i посилать всё 4то угодно(взависимости от сервлета)

Да можно и сервлет не писать. Можно хоть УДП датаграмму.
Суть в том, что это:
во-первых - асинхронно(ты отправил месседж и всё. Его получат. Не надо ждать обработки сего месседжа чтоб продолжить выполнение кода далее)
во-вторых - надёжно, как для асинхронного... То есть... это как бы УДП... только на более высоком уровне абстракции и с большими гарантиями доставки smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
KostenkoSergey
Дата 4.9.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



а как на счёт передачи не TextMessage ?
Как раз вот HashMap в пропертиесы запихнуть пытаюсь - так в бине property_name есть, а значение null smile
(HashMap - serializable ж - должно, а не хочет)
Исходина ниже .
клиент:
Код

      QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup(_QCF);
      Queue queue = (Queue) ctx.lookup(_queue);
      QueueConnection connect = factory.createQueueConnection();
      QueueSession session = connect.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
      QueueSender sender = session.createSender(queue);
      sender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
      MapMessage message = session.createMapMessage();
      connect.start();
      message.setObjectProperty("PARAMS", prop_.getProperty(propName)); // тут HashMap
      sender.send(message);
      connect.close();


бин:
Код

      MapMessage message_ = (MapMessage) message;
      Object p = message_.getObjectProperty("PARAMS"); // а тут нулл (хотя в пропертинеймсах "PARAMS" есть)




Это сообщение отредактировал(а) KostenkoSergey - 4.9.2006, 18:49
PM ICQ   Вверх
KostenkoSergey
Дата 4.9.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



В предидущем посте я немного тупанул.... 

message.setObjectProperty("PARAMS", new HashMap());  - вызывает javax.jms.MessageFormatException: Invalid object type
Посмотрел исходину жбосовского SpyMapMessage:

Код

synchronized (content)
      {
         if (value instanceof Boolean)
            content.put(name, value);
         else if (value instanceof Byte)
            content.put(name, value);
         else if (value instanceof Short)
            content.put(name, value);
         else if (value instanceof Character)
            content.put(name, value);
         else if (value instanceof Integer)
            content.put(name, value);
         else if (value instanceof Long)
            content.put(name, value);
         else if (value instanceof Float)
            content.put(name, value);
         else if (value instanceof Double)
            content.put(name, value);
         else if (value instanceof String)
            content.put(name, value);
         else if (value instanceof byte[])
            content.put(name, ((byte[]) value).clone());
         else
            throw new MessageFormatException("Invalid object type.");
      }


абыдно ....  smile 
PM ICQ   Вверх
w1nd
Дата 4.9.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 7
Всего: 54



Цитата(Tony @ 7.3.2006,  19:35)
А не прощели написать сервлет.Скачать jakarta HttpClient i посилать всё 4то угодно(взависимости от сервлета)  smile

Может и проще. Пока не дойдёт до транзакций, кластеризации, распределения нагрузки, необходимости хранения и/или повторной обработки сообщений, удаленного мониторинга и т. д. и т. п.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
KostenkoSergey
Дата 14.5.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



... ещё 5 копеек smile

Цитата(Domestic Cat @  23.3.2005,  20:43 Найти цитируемый пост)
        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");
 

Имхо, такие весчи, если подразумевается множественное использование, лучше вынести из метода куда-то или в конструктор класса или  по паттерну "Service Locator", и пользовать 
Код

_connection.start();


Кстати, есть какие-то паттерны, рекомендуемые к использованию в случае MDB ? smile 
PM ICQ   Вверх
chief39
Дата 14.5.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Цитата(KostenkoSergey @  14.5.2007,  14:33 Найти цитируемый пост)
Кстати, есть какие-то паттерны, рекомендуемые к использованию в случае MDB ?

РАДИ JMS?

Или на основе его, типа:
Service Activator etc?


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
KostenkoSergey
Дата 14.5.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Цитата(chief39 @  14.5.2007,  14:41 Найти цитируемый пост)
РАДИ JMS?

Или на основе его, типа:
Service Activator etc? 


А хто его знает ...
У мя тут, при большом кол-ве JMS-сендов: 
Код

2007-05-14 14:50:36,140 ERROR  - javax.jms.JMSException: The broker cannot accept any more connections.
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jimpl.JMSExceptionUtil.createJMSException(Unknown Source)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jimpl.Connection.<init>(Unknown Source)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jimpl.QueueConnection.<init>(Unknown Source)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jimpl.xa.XAQueueConnection.<init>(Unknown Source)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jclient.xa.XAQueueConnectionFactory.createXAQueueConnection(Unkno
Source)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jclient.xa.XAQueueConnectionFactory.createQueueConnection(Unknown
urce)
2007-05-14 14:50:36,140 ERROR  -        at progress.message.jclient.xa.XAQueueConnectionFactory.createQueueConnection(Unknown
urce)


воть и думаю... мож я што то не так делаю ...
PM ICQ   Вверх
chief39
Дата 14.5.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Цитата(KostenkoSergey @  14.5.2007,  17:46 Найти цитируемый пост)
А хто его знает ...
У мя тут, при большом кол-ве JMS-сендов: 

Гм... может при большом количестве коннекшнов? smile
Кста, сенды у тебя пакетно проходят? Или коммит после каждого сенда?

ЗЫ: Заведи отдельную тему - подумкаем smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1097 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.