|
|
|
jms технология
|
|||
|---|---|---|---|
|
#18+
начал изучать jms , что - то никак не пойму , обязательно их реализоывать как как сессион бин или можно просто класс написать из которого будет осуществлятся поиск и подключение к Топику или точке? и как запустить такую программу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 17:32:54 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
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(); } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 18:18:38 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
блин, запости заново, воспользовавшись кнопкой SRC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 19:21:57 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Код: 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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 22:44:55 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Просто не совсем понимаю как такое должно работать, попробовал написать такой класс ( но без мейн) и вызывать метод для отправки - получения из другого класса , но это же должно обрабатыватся веб сервервером , а получается, что для размещения в веб контенере надо что бы это был ejb т е надо наследовать бин и реализовать интерфейсы "обращения" , а без ejb никак ? т е вот такой вариант как в статье не реализовать? И ещё вопрос: можно ли такое приложение (без ejb) запустить на Tomcat или нужен именно веб контеннер (когда я пытался с tomcat он ругался на отсутствие javax.jms библиотеки хоть она и лежала в проекте) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 23:08:02 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Руслан806Просто не совсем понимаю как такое должно работать, попробовал написать такой класс ( но без мейн) и вызывать метод для отправки - получения из другого класса , но это же должно обрабатыватся веб сервервером , а получается, что для размещения в веб контенере надо что бы это был ejb т е надо наследовать бин и реализовать интерфейсы "обращения" , а без ejb никак ? т е вот такой вариант как в статье не реализовать? - JMS это служба обмена сообщениями (аналог - электронная почта) и для ее работы необходимо наличие работающего JMS-сервера (обычно встроен в сервер приложений). Для коннекта к JMS-серверу надо получить его контекст через JNDI (аналог - соединение с почтовым сервером, требующее имя почтового сервера и порт на котором он работает). - Ваше консольное приложение будет работать при соблюдении двух условий: а) наличии работающего JMS-сервера б) правильном задании имени службы в контексте JNDI (в Вашем случае имя подозрительно короткое, такие имя возможно если JMS-служба и приложение запущены в общей JVM, что очевидно не так) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 00:25:55 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Kachalovа) наличии работающего JMS-сервера) правильно я понял, что достаточно запустить сервер , диплоить туда (данный) проект не надо Kachalov б) правильном задании имени службы в контексте JNDI (в Вашем случае имя подозрительно короткое, такие имя возможно если JMS-служба и приложение запущены в общей JVM, что очевидно не так) у сервера и приложения одинаковые JAVA_HOME ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 10:16:57 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Руслан806 правильно я понял, что достаточно запустить сервер , диплоить туда (данный) проект не надо - JMS-сервер должен быть зарегестрирован в JNDI под именем "MyConnectionFactory" (судя по приведенному коду) и в JMS сервере необходимо каким то образом создать очередь с именем "MyQueue". Первый из приведенных классов это консольное приложение, а второй вообще не понятно что. Если второй класс это MDB, то он должен реализовывать интерфейс javax.ejb.MessageDrivenBean. Т. к. второй класс явно не консольное приложение, то он должен запускаться в каком то контейнере, в каком прочтите там где Вы этот пример достали. Руслан806у сервера и приложения одинаковые JAVA_HOME - а еще у них общий жесткий диск :) Т. к. экземпляры JVM разные, то и доступ к JNDI контексту должен осуществляться удаленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 11:08:54 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
Kachalov.. а второй вообще не понятно что .. - сорри, не разглядел метод main - второй класс то же консольное приложение, т. е. "деплоить" никого не надо, но замечание про JMS-сервер остается в силе: он должен быть запущен, в нем должна быть создана очередь сообщений и он должен быть связан с JNDI-контекстом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 11:12:11 |
|
||
|
jms технология
|
|||
|---|---|---|---|
|
#18+
спасибо большое , за помощь!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 11:17:22 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34570771&tid=2145534]: |
0ms |
get settings: |
17ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
47ms |
get topic data: |
23ms |
get forum data: |
5ms |
get page messages: |
105ms |
get tp. blocked users: |
3ms |
| others: | 311ms |
| total: | 553ms |

| 0 / 0 |
