powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jms технология
12 сообщений из 12, страница 1 из 1
jms технология
    #34570499
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
начал изучать jms , что - то никак не пойму , обязательно их реализоывать как как сессион бин или можно просто класс написать из которого будет осуществлятся поиск и подключение к Топику или точке? и как запустить такую программу?
...
Рейтинг: 0 / 0
jms технология
    #34570526
y3u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
jms технология
    #34570540
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.javable.com/columns/serv_side/workshop/14/
в этой статье приведён пример :


как я понял , для работы jms приложение его надо реализовать как бин (S /E) и выложить на java ee сервер и обращатся к нему как к ejb , а тут просто класс или это нерабочий пример?
Итак, приступим к созданию простейших sender и receiver.

// Используем JMS и JNDI пакеты
import javax.jms.*;
import javax.naming.*;
public class SimpleSender{
public static void main(String args[]){
try {
//Сначала найдем сервис JNDI
Contect ctx = new InitialContext();
//Теперь найдем ConnectionFactory с помощью JNDI
//Имя, с которым зарегистрирован
// стандартный ConnectionFactory в дереве
// JNDIзависит от реализации –
// например, в случае WebLogic Server это
// weblogic.jms.ConnectionFactory
QueueConnectionFactory qcf =
(QueueConnectionFactory)ctx.lookup(
"MyConnectionFactory");
//А теперь создадим Connection
QueueConnection con = qcf.createQueueConnection();
//Создадим Session со следующими свойствами:
//а)посылка сообщений не является частью транзакции
//б)подтверждение о получении сообщения осуществляет JMS
//автоматически
QueueSession session =
con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//Найдем Destination с помощью JNDI. Если еще не существует
// (не зарегистрирована в JNDI) – создадим и зарегистрируем
Queue queue = null;
try{
queue = (Queue)ctx.lookup("MyQueue");
}catch(NameNotFoundException nnfe){
queue = session.createQueue("MyQueue");
ctx.bind("MyQueue",queue);
}
//Простейшее текстовое сообщение
TextMessage textMessage =
session.createTextMessage();
//Создадим Producer
QueueSender sender =
session.createSender(queue);
//Активизируем Connection
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();
}
}
}

и
Первый пример receiver – с использованием receive().

import javax.jms.*;
import javax.naming.*;
public class SyncReceiver {
public static void main(String[] args) {
try{
Context ctx = new InitialContext();
QueueConnectionFactory qcf =
(QueueConnectionFactory)ctx.lookup("MyConnectionFactory");
QueueConnection con = qcf.createQueueConnection();
QueueSession session =
con.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = null;
try{
queue = (Queue)ctx.lookup("MyQueue");
}catch(NameNotFoundException nnfe){
queue = session.createQueue("MyQueue");
ctx.bind("MyQueue", queue);
}
// Создадим Consumer
QueueReceiver receiver = session.createReceiver(queue);
// Активизируем Connection
con.start();
//Мы готовы принимать сообщения
for(;;){
//Обратите внимание на использование метода receive()
TextMessage textMessage = (TextMessage)receiver.receive();
System.out.println("Got a message :"+textMessage.getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
}

Следующий пример – асинхронное получение сообщений с использованием интерфейса MessageListener.

import javax.jms.*;
import javax.naming.*;
//Обратите внимание, что класс реализует интерфей MessageListener
public class AsyncReceiver implements MessageListener{
public AsyncReceiver(){
}
//Метод onMessage интерфейса MessageListener будет вызван
//Consumer'ом для обработки поступившего сообщения
public void onMessage(Message message){
try{
TextMessage textMessage = (TextMessage)message;
System.out.println("Got a message : "+textMessage.getText());
}catch(JMSException jmse){
jmse.printStackTrace();
}
}
public static void main(String[] args) {
try{
Context ctx = new InitialContext();
QueueConnectionFactory qcf =
(QueueConnectionFactory)ctx.lookup( "MyConnectionFactory");
QueueConnection con = qcf.createQueueConnection();
QueueSession session =
con.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = null;
try{
queue = (Queue)ctx.lookup("MyQueue");
}catch(NameNotFoundException nnfe){
queue = session.createQueue("MyQueue");
ctx.bind("MyQueue", queue);
}
QueueReceiver receiver = session.createReceiver(queue);
con.start();
AsyncReceiver async = new AcyncReceiver();
//Зарегистрировать новый AsyncReceiver обьект как
//MessageListener дляreceiver
receiver.setMessageListener(async);
//А далее - делать что-либо, не ожидая сообщения.
//Сообщение будет обработано, как только придет.
//Для примера будем эмулировать бурную деятельность –
//"спать"!
Thread.sleep(100000000);
}catch(Exception e){
e.printStackTrace();
}
}
}
...
Рейтинг: 0 / 0
jms технология
    #34570584
y3u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, запости заново, воспользовавшись кнопкой SRC
...
Рейтинг: 0 / 0
jms технология
    #34570756
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
// Используем JMS и JNDI пакеты
 import  javax.jms.*;
 import  javax.naming.*;

 public   class  SimpleSender{
     public   static   void  main(String args[]){
     try  {
        //Сначала найдем сервис JNDI
        Contect ctx =  new  InitialContext();
        //Теперь найдем ConnectionFactory с помощью JNDI
        //Имя, с которым зарегистрирован
        // стандартный ConnectionFactory в дереве
        // JNDIзависит от реализации –
        // например, в случае WebLogic Server это
        // weblogic.jms.ConnectionFactory
        QueueConnectionFactory qcf =
        (QueueConnectionFactory)ctx.lookup(
        "MyConnectionFactory");
        //А теперь создадим Connection
        QueueConnection con = qcf.createQueueConnection();
        //Создадим Session со следующими свойствами:
        //а)посылка сообщений не является частью транзакции
        //б)подтверждение о получении сообщения осуществляет JMS   
        //автоматически
        QueueSession session =
        con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
        //Найдем Destination с помощью JNDI. Если еще не существует
        // (не зарегистрирована в JNDI) – создадим и зарегистрируем
        Queue queue =  null ;
         try {
          queue = (Queue)ctx.lookup("MyQueue");
        } catch (NameNotFoundException nnfe){
          queue = session.createQueue("MyQueue");
          ctx.bind("MyQueue",queue);
        }
        //Простейшее текстовое сообщение
        TextMessage textMessage =
        session.createTextMessage();
        //Создадим Producer
        QueueSender sender =
        session.createSender(queue);
        //Активизируем Connection
        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();
     }
  }
}




Код: 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.
 import  javax.jms.*;
 import  javax.naming.*;

//Обратите внимание, что класс реализует интерфей MessageListener
 public   class  AsyncReceiver  implements  MessageListener{
   public  AsyncReceiver(){
  }
  //Метод onMessage интерфейса MessageListener будет вызван
  //Consumer'ом для обработки поступившего сообщения
   public   void  onMessage(Message message){
      try {
         TextMessage textMessage = (TextMessage)message;
         System.out.println("Got a message : "+textMessage.getText());
     } catch (JMSException jmse){
          jmse.printStackTrace();
     }
  }
   public   static   void  main(String[] args) {
     try {
      Context ctx =  new  InitialContext();
      QueueConnectionFactory qcf =
      (QueueConnectionFactory)ctx.lookup( "MyConnectionFactory");
      QueueConnection con = qcf.createQueueConnection();
      QueueSession session =
      con.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
      Queue queue =  null ;
       try {
         queue = (Queue)ctx.lookup("MyQueue");
      } catch (NameNotFoundException nnfe){
         queue = session.createQueue("MyQueue");
         ctx.bind("MyQueue", queue);
      }
      QueueReceiver receiver = session.createReceiver(queue);
      con.start();
      AsyncReceiver async =  new  AcyncReceiver();
      //Зарегистрировать новый AsyncReceiver обьект как
      //MessageListener дляreceiver
      receiver.setMessageListener(async);
      //А далее - делать что-либо, не ожидая сообщения.
      //Сообщение будет обработано, как только придет.
      //Для примера будем эмулировать бурную деятельность –
      //"спать"!
      Thread.sleep( 100000000 );
    } catch (Exception e){
    e.printStackTrace();
    }
  }
}



...
Рейтинг: 0 / 0
jms технология
    #34570771
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто не совсем понимаю как такое должно работать, попробовал написать такой класс ( но без мейн) и вызывать метод для отправки - получения из другого класса , но это же должно обрабатыватся веб сервервером , а получается, что для размещения в веб контенере надо что бы это был ejb т е надо наследовать бин и реализовать интерфейсы "обращения" , а без ejb никак ? т е вот такой вариант как в статье не реализовать?
И ещё вопрос: можно ли такое приложение (без ejb) запустить на Tomcat или нужен именно веб контеннер (когда я пытался с tomcat он ругался на отсутствие javax.jms библиотеки хоть она и лежала в проекте)
...
Рейтинг: 0 / 0
jms технология
    #34570824
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан806Просто не совсем понимаю как такое должно работать, попробовал написать такой класс ( но без мейн) и вызывать метод для отправки - получения из другого класса , но это же должно обрабатыватся веб сервервером , а получается, что для размещения в веб контенере надо что бы это был ejb т е надо наследовать бин и реализовать интерфейсы "обращения" , а без ejb никак ? т е вот такой вариант как в статье не реализовать?
- JMS это служба обмена сообщениями (аналог - электронная почта) и для ее работы необходимо наличие работающего JMS-сервера (обычно встроен в сервер приложений). Для коннекта к JMS-серверу надо получить его контекст через JNDI (аналог - соединение с почтовым сервером, требующее имя почтового сервера и порт на котором он работает).

- Ваше консольное приложение будет работать при соблюдении двух условий:
а) наличии работающего JMS-сервера
б) правильном задании имени службы в контексте JNDI (в Вашем случае имя подозрительно короткое, такие имя возможно если JMS-служба и приложение запущены в общей JVM, что очевидно не так)
...
Рейтинг: 0 / 0
jms технология
    #34571183
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalovа) наличии работающего JMS-сервера)
правильно я понял, что достаточно запустить сервер , диплоить туда (данный) проект не надо
Kachalov
б) правильном задании имени службы в контексте JNDI (в Вашем случае имя подозрительно короткое, такие имя возможно если JMS-служба и приложение запущены в общей JVM, что очевидно не так)

у сервера и приложения одинаковые JAVA_HOME
...
Рейтинг: 0 / 0
jms технология
    #34571357
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан806
правильно я понял, что достаточно запустить сервер , диплоить туда (данный) проект не надо

- JMS-сервер должен быть зарегестрирован в JNDI под именем "MyConnectionFactory" (судя по приведенному коду) и в JMS сервере необходимо каким то образом создать очередь с именем "MyQueue". Первый из приведенных классов это консольное приложение, а второй вообще не понятно что. Если второй класс это MDB, то он должен реализовывать интерфейс javax.ejb.MessageDrivenBean. Т. к. второй класс явно не консольное приложение, то он должен запускаться в каком то контейнере, в каком прочтите там где Вы этот пример достали.

Руслан806у сервера и приложения одинаковые JAVA_HOME
- а еще у них общий жесткий диск :) Т. к. экземпляры JVM разные, то и доступ к JNDI контексту должен осуществляться удаленно.
...
Рейтинг: 0 / 0
jms технология
    #34571365
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov.. а второй вообще не понятно что ..
- сорри, не разглядел метод main - второй класс то же консольное приложение, т. е. "деплоить" никого не надо, но замечание про JMS-сервер остается в силе: он должен быть запущен, в нем должна быть создана очередь сообщений и он должен быть связан с JNDI-контекстом.
...
Рейтинг: 0 / 0
jms технология
    #34571386
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо большое , за помощь!!
...
Рейтинг: 0 / 0
jms технология
    #34571572
Руслан806
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
j2eeadmin где взять эту утилиту ?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / jms технология
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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