powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по JMS
20 сообщений из 20, страница 1 из 1
Вопрос по JMS
    #32886233
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа
Не могу врубиться в суть JMS
На сервере запускается какой-нить сервлет, который инициирует
чтото типа Queue и ConnectionFactory
и дальше
MessageProducer producer = jmsSession.createProducer(queue);
Message message = jmsSession.createTextMessage(text);
producer.send(message);
Тут же на сервере крутиться bean implements MessageDrivenBean, MessageListener, в котором переопределены такие методы
ejbCreate() , setMessageDrivenContext(MessageDrivenContext cxt) и
onMessage(Message msg) - последний реагирует на получение сообщений.
Так в чем весь прикол я чтото не пойму -я что, могу этот bean установить на удаленного клиента(но он не инстаируеться вне сервера)?
или они вместе должны крутиться на одном сервере, а клиент както к очереди подключаться?
Кстати, было бы неплохо такой раздел FAQ сделать.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886338
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в чем весь прикол я чтото не пойму -я что, могу этот bean установить на удаленного клиента(но он не инстаируеться вне сервера)?
или они вместе должны крутиться на одном сервере, а клиент както к очереди подключаться?

Сейчас делаю такую фишку, есть JBoss на нем много всяких EJB в том числе и Message DrivenBeans, есть клиент. который является обычным апликейшеном и установлен на др. машине, если клиенту нужно обратится к MDrivenBean'у то используется RMI-IIOP и JNDI, а вот если бину нужно обратиться к клиенту, то уже проблемы, можно конечно через тот же RMI, но это очень геморойно. Самый простой вариант в этом случае, создать очердь в JBoss, подклюить к ней MDBean (не проблема), а мой апликейшен подключается примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
 import  javax.jms.Queue;
 import  javax.jms.QueueConnectionFactory;
 import  javax.jms.QueueReceiver;
 import  javax.jms.JMSException;
 import  javax.jms.QueueSession;
 import  javax.jms.QueueConnection;
 import  javax.jms.Session;
 import  javax.jms.MessageListener;
 import  javax.jms.Message;

 import  javax.naming.Context;
 import  javax.naming.InitialContext;
 import  javax.naming.NamingException;

 import  ?????.Connector.utils.Utilities;

 public   class  MessageReceiver  implements  MessageListener{
    
     private   final   static  String queueConnFactoyJNDIName="java:/ConnectionFactory";
     private   final   static  String queueJNDIName="java:/queue/Adapter2ConnectorDirectQueue";
    
     private  QueueReceiver receiver;
    
    /** Creates a new instance of MessageReceiver */
     public  MessageReceiver() {
        initQueue();
    }
    
     private   void  initQueue(){
         try {
            InitialContext initContext= new  InitialContext();
            //получение фабрики
            QueueConnectionFactory factory=(QueueConnectionFactory)Utilities.
                    jndiLookup(initContext, queueConnFactoyJNDIName);
            
            //получение очереди
            Queue queue=(Queue)Utilities.jndiLookup(initContext, queueJNDIName);
            
            //создание соединения, сеанса и получателя
            QueueConnection connection=factory.createQueueConnection();
            QueueSession sess=connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            receiver=sess.createReceiver(queue);
            
            //установка слушателя сообщение
            receiver.setMessageListener( this );
            
            //установка соеденения
            connection.start();
            
        } catch (NamingException e){
            e.printStackTrace(System.out);
        } catch (JMSException e){
            e.printStackTrace(System.out);
        }
    }
    
    //прием нового сообщения
     public   void  onMessage(Message msg){
        System.out.println("Message on.");
    }
    
}



и через эту очередь они оч. хорошо общаются :)
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886340
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonГоспода
Не могу врубиться в суть JMS
На сервере запускается какой-нить сервлет, который инициирует
чтото типа Queue и ConnectionFactory
и дальше
MessageProducer producer = jmsSession.createProducer(queue);
Message message = jmsSession.createTextMessage(text);
producer.send(message);
Тут же на сервере крутиться bean implements MessageDrivenBean, MessageListener, в котором переопределены такие методы
ejbCreate() , setMessageDrivenContext(MessageDrivenContext cxt) и
onMessage(Message msg) - последний реагирует на получение сообщений.
Так в чем весь прикол я чтото не пойму -я что, могу этот bean установить на удаленного клиента(но он не инстаируеться вне сервера)?
или они вместе должны крутиться на одном сервере, а клиент както к очереди подключаться?
Кстати, было бы неплохо такой раздел FAQ сделать.

Не обязаны они быть на одном сервере. А настройка подключения зависит от того на чём это всё "крутится".
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886457
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо wessen.
То есть клиент на другой машиен использует
JNDIName="java:/ConnectionFactory" чтоб создать QueueConnectionFactory
-> QueueConnection -> QueueSession,
а JNDIName="java:/queue/Adapter2ConnectorDirectQueue" чтоб создать
MessageReceiver. Метод onMessage запускается при появлении в очереди события.
Вопрос - а где простой аппликейшн должен искать эти JNDI?
Какой-нить xml документ ему нужен или что? Он де xml документов, что на сервере не видит?
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886548
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonСпасибо wessen.
То есть клиент на другой машиен использует
JNDIName="java:/ConnectionFactory" чтоб создать QueueConnectionFactory
-> QueueConnection -> QueueSession,
а JNDIName="java:/queue/Adapter2ConnectorDirectQueue" чтоб создать
MessageReceiver. Метод onMessage запускается при появлении в очереди события.
Вопрос - а где простой аппликейшн должен искать эти JNDI?
Какой-нить xml документ ему нужен или что? Он де xml документов, что на сервере не видит?

Как правильно подметил господин mozheyko_d, все зависит от того, на чем крутятся EJB, что косается конкретно JBoss, могу разъяснить. Во первых на клинте должны лежать домашний и внешний интерфейсы EJB компонента который ты юзаешь, так же нужен файл jndi.properties , для JBoss должен быть таким :

Код: plaintext
1.
2.
3.
4.
### JBossNS properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://some-host:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

Класс InitialContext берет данные и этого файла, соответственно клиенту в класспас нужно указать библиотеку спецефичную для JBoss, ну типа jbossall-client.jar . Туда входят стандартные интерфейсы и классы javax.ejb.* EJB , Классы сервисов Java Authentication и Authorization Service, JBossSX классы расширенной безопасности, Прокси и стаб классы для JBoss EJB, клиентские классы провайдера JBoss JNDI. Вот вроде и все,..... кстати EJB с которыми обшаешся через JMS не обязятельно должня быть MessageDriven.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886639
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonСпасибо wessen.
То есть клиент на другой машиен использует
JNDIName="java:/ConnectionFactory" чтоб создать QueueConnectionFactory
-> QueueConnection -> QueueSession,
а JNDIName="java:/queue/Adapter2ConnectorDirectQueue" чтоб создать
MessageReceiver. Метод onMessage запускается при появлении в очереди события.
Вопрос - а где простой аппликейшн должен искать эти JNDI?
Какой-нить xml документ ему нужен или что? Он де xml документов, что на сервере не видит?
Для Jboss можно прямо в коде сервлета написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
          ...
          String myRemoteMDBServer = "1.1.1.1"; // здесь ip или имя сервака
          Hashtable jndiParameters =  new  Hashtable();
            jndiParameters.put( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            jndiParameters.put( Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
            jndiParameters.put( Context.PROVIDER_URL, myRemoteMDBServer + ":1099");
            InitialContext jndiContext =  new  InitialContext( jndiParameters);
           QueueConnectionFactory factory = ( QueueConnectionFactory)jndiContext.lookup( "ConnectionFactory");
            Queue queue = ( Queue) jndiContext.lookup( "queue/testQueue");
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session = connection.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE);
            ...
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886656
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozheyko_d
Для Jboss можно прямо в коде сервлета написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
          ...
          String myRemoteMDBServer = "1.1.1.1"; // здесь ip или имя сервака
          Hashtable jndiParameters =  new  Hashtable();
            jndiParameters.put( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            jndiParameters.put( Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
            jndiParameters.put( Context.PROVIDER_URL, myRemoteMDBServer + ":1099");
            InitialContext jndiContext =  new  InitialContext( jndiParameters);
           QueueConnectionFactory factory = ( QueueConnectionFactory)jndiContext.lookup( "ConnectionFactory");
            Queue queue = ( Queue) jndiContext.lookup( "queue/testQueue");
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session = connection.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE);
            ...

- тот сервлет типа на сервере лежит и клиент (например апп) вызывает его - так что ли?
Апп сервер - resin
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886662
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson mozheyko_d
Для Jboss можно прямо в коде сервлета написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
          ...
          String myRemoteMDBServer = "1.1.1.1"; // здесь ip или имя сервака
          Hashtable jndiParameters =  new  Hashtable();
            jndiParameters.put( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            jndiParameters.put( Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
            jndiParameters.put( Context.PROVIDER_URL, myRemoteMDBServer + ":1099");
            InitialContext jndiContext =  new  InitialContext( jndiParameters);
           QueueConnectionFactory factory = ( QueueConnectionFactory)jndiContext.lookup( "ConnectionFactory");
            Queue queue = ( Queue) jndiContext.lookup( "queue/testQueue");
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session = connection.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE);
            ...

- тот сервлет типа на сервере лежит и клиент (например апп) вызывает его - так что ли?
Апп сервер - resin

Вопрос был можно ли вынести MDB на другой сервер и как к нему тогда прицепиться из сервлета?
Ответ: можно, в сервлете напиши этот код для отсылки сообщений, а на другом сервере установи свой MDB обработчик.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886669
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в случае с resin, код придётся всё-таки изменить.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32886943
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32887632
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все ясно - только как указать JNDI для клиента типа JFrame на удаленной машине при работе с resin?
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32887681
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonВсе ясно - только как указать JNDI для клиента типа JFrame на удаленной машине при работе с resin?

Не понял чего нада?

oson
Апп сервер - resin


А Resin это сервер приложений разве, я все время думал, что это сервлет контейнер....
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32887710
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя да, все таки Resin сервер приложение - http://www.caucho.com (Гугл рулит)
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32887915
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonВсе ясно - только как указать JNDI для клиента типа JFrame на удаленной машине при работе с resin?

А что такого страшного в моём примере?
Какая строчка не сработает на "клиенте типа JFrame" ?
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32888838
slolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду как записать для JFrame клиента resin properties
### JBossNS properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://some-host:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

А вот за сервлет если можешь (сорри за непонятливость) обьясни структуру - я чёйто не доганяю.
Ну вот крутиться сервлет с твоим кодом. Там он создает
Hashtable jndiParameters....
На другой машине нет сервера - просто запускаем class JFrame.
которому надо
QueueConnectionFactory factory=(QueueConnectionFactory)
jndiLookup(initContext, queueConnFactoyJNDIName);
Queue queue=(Queue)Utilities.jndiLookup(initContext, queueJNDIName);
Как он его получает от сервлета - я не понял? И в каком формате?
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32888880
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slolenЯ имел ввиду как записать для JFrame клиента resin properties
### JBossNS properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://some-host:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces


Это параметры для JBoss, для resin они другие - какие незнаю надо читать доки по нему.

slolen
А вот за сервлет если можешь (сорри за непонятливость) обьясни структуру - я чёйто не доганяю.
Ну вот крутиться сервлет с твоим кодом. Там он создает
Hashtable jndiParameters....
На другой машине нет сервера - просто запускаем class JFrame.
которому надо
QueueConnectionFactory factory=(QueueConnectionFactory)
jndiLookup(initContext, queueConnFactoyJNDIName);
Queue queue=(Queue)Utilities.jndiLookup(initContext, queueJNDIName);
Как он его получает от сервлета - я не понял? И в каком формате?

Это код для подключения к очереди сообщений и отсылки их в неё (понятно сказал? ;-)) и если в параметре Context.PROVIDER_URL указать правильный сервер с работающим например JBoss, то этот код отлично работает.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32888922
slolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozheyko_d
...
String myRemoteMDBServer = "1.1.1.1"; // здесь ip или имя сервака
Hashtable jndiParameters = new Hashtable();
jndiParameters.put( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
jndiParameters.put( Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
jndiParameters.put( Context.PROVIDER_URL, myRemoteMDBServer + ":1099");
InitialContext jndiContext = new InitialContext( jndiParameters);
QueueConnectionFactory factory = ( QueueConnectionFactory)jndiContext.lookup( "ConnectionFactory");
Queue queue = ( Queue) jndiContext.lookup( "queue/testQueue");
QueueConnection connection = factory.createQueueConnection();
QueueSession session = connection.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE);
...
[/src] - это код на клиенте то есть
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32888938
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slolen mozheyko_d
...
String myRemoteMDBServer = "1.1.1.1"; // здесь ip или имя сервака
Hashtable jndiParameters = new Hashtable();
jndiParameters.put( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
jndiParameters.put( Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
jndiParameters.put( Context.PROVIDER_URL, myRemoteMDBServer + ":1099");
InitialContext jndiContext = new InitialContext( jndiParameters);
QueueConnectionFactory factory = ( QueueConnectionFactory)jndiContext.lookup( "ConnectionFactory");
Queue queue = ( Queue) jndiContext.lookup( "queue/testQueue");
QueueConnection connection = factory.createQueueConnection();
QueueSession session = connection.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE);
...
[/src] - это код на клиенте то есть

угу
И не важно сервлет он, просто Java приложение или ещё кто.
...
Рейтинг: 0 / 0
Вопрос по JMS
    #32889483
slolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.
Пробую
...
Рейтинг: 0 / 0
Вопрос по JMS
    #33488033
Vasisualiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
package p2p;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NoInitialContextException;

public class SimpleSender {
public static void main(String[] args) {
try {
Context ctx = new InitialContext();
QueueConnectionFactory qcf = null;
try {
qcf = (QueueConnectionFactory)ctx.lookup("java:comp/env/jms/QueueConnectionFactory");
} catch (NoInitialContextException nice) {
nice.printStackTrace();

}
QueueConnection con = qcf.createQueueConnection();
QueueSession session =
con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = null;
try {
queue = (Queue)ctx.lookup("jms/MyQueue");
} catch(NameNotFoundException nnfe){
queue = session.createQueue("MyQueue");
ctx.bind("jms/MyQueue",queue);
}
TextMessage textMessage =
session.createTextMessage();
QueueSender sender =
session.createSender(queue);
con.start();
long sendInterval;
try {
sendInterval = Long.parseLong(args[0]);
} catch(Exception rae){
sendInterval = 1000;
}
for(int i=0;i<1000;i++) {
textMessage.setText("Hi! It's my message number "+i);
sender.send(textMessage);
try {
Thread.sleep(sendInterval);
}catch(Exception se){
System.out.println("Got an exception "+se.getMessage());
}
}
} catch(Exception e) {
e.printStackTrace();
}

}

}

Написал я этот сендер а запустить его не могу как и где мне этот jms/QueueConnectionFactory прописать. Где тут JBoss спользовать?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по JMS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]