powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Servlet'а прочитать асинхронно сообщение из JMS
8 сообщений из 8, страница 1 из 1
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312108
Oleg_SP1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно при традиционном чтении сообщения в сервлете
boolean goodByeReceiver = false;
mSc = getServletContext();

JMSContext jmsContext = connectionFactory.createContext();
JMSConsumer jmsConsumer = jmsContext.createConsumer(queue);

message = jmsConsumer.receiveBody(String.class);
mSc.log("receiver message from queue: " + message);


возникает неприятный эффект что если очередь пуста, то сервлет зависает. При использовании слушателя столкнулся с проблемой получая 500 ошибку с сообщением в логах что метод слушателя нельзя использовать в
This method may not be called in a Java EE web or EJB container


Сам код у меня (который не работает) такой:
JMSContext jmsContext = connectionFactory.createContext();
JMSConsumer jmsConsumer = jmsContext.createConsumer(queue);

AsynchMessageListener aml = new AsynchMessageListener(mSc);
jmsConsumer.setMessageListener(aml);
mSc.log("into servlet :" + aml.getStrMessage());

Код слушателя такой:


@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
TextMessage textMessage = (TextMessage) message;

strMessage = "";

try {
strMessage = textMessage.getText();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
strMessage = "exception detected";
}

mSc.log("into listener" + strMessage);
}
Вопрос, куда копать или смотреть?
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312127
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слушать в EJB-синглтон + его инжект в сервлет (или JNDI lookup)
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312130
Oleg_SP1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Слушать в EJB-синглтон + его инжект в сервлет (или JNDI lookup)

Кхм. Спасибо попробую!
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312131
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SP1975возникает неприятный эффект что если очередь пуста, то сервлет зависает.

JavaDoc не пробовали читать?
https://docs.oracle.com/javaee/7/api/javax/jms/JMSConsumer.html

Oleg_SP1975Вопрос, куда копать или смотреть?
В целом, сама затея на каждый реквест выгребать сообщение очень дурно попахивает.
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312132
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернее так:
В сервлет инжектим синглтон.
В мессандждривен инжектим тот же синглтон.
Сообщение приходит, вызывается мессадж дривет, меняем синглтон...
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312277
Oleg_SP1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczOleg_SP1975возникает неприятный эффект что если очередь пуста, то сервлет зависает.

JavaDoc не пробовали читать?
https://docs.oracle.com/javaee/7/api/javax/jms/JMSConsumer.html

Oleg_SP1975Вопрос, куда копать или смотреть?
В целом, сама затея на каждый реквест выгребать сообщение очень дурно попахивает.

а как сделать правильно при последующей постановке задачи:
есть один сервер который находится в не trust сети, на нем крутится первый сервер приложений. Есть второй сервер с сервером приложений который находится уже в trust сети. По соображениям безопасности запрос с начало приходит на внешний сервер, который затем перебрасывает его на внутренней сервер и тот запускает некие бизнес процессы и затем генерит ответ. Так я сделал сейчас и это прекрасно работает.
(Запрос на внешний сервер приходит с определенного айпи и с сертификатом. Дальше по https передается внутрь)
Посоветовавшись с товарищами из смежных областей те указали на потенциальную дырку, что внешний сервер имеет доступ к внутренний сети. Правильнее что бы внутренний сервер сам был инициатором соединения с внешним и выгребал все данные оттуда а также давал ответына предыдущие ответы.
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39312281
Oleg_SP1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Вернее так:
В сервлет инжектим синглтон.
В мессандждривен инжектим тот же синглтон.
Сообщение приходит, вызывается мессадж дривет, меняем синглтон...

понял
завтра с утра так и сделаю
сегодня уже не успел
...
Рейтинг: 0 / 0
Как из Servlet'а прочитать асинхронно сообщение из JMS
    #39313016
Oleg_SP1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что у меня получилось
сам сервлет (для краткости привожу только метод GET)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                               // TODO Auto-generated method stub
                               response.getWriter().append("Served at: ").append(request.getContextPath());
                               mSc = getServletContext();
 
                               MySingleton mySingleton = MySingleton.newInstance();
                              
                               ArrayList<MyModel> models = mySingleton.getModels();
                               for (MyModel model: models){
                                               mSc.log("string is " + model.getString() + ", int is " + model.getInt());
                               }
                              
                }



Синглетон выглядит так
Код: java
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.
public class MySingleton {
 
                                                                                                //jms/MyEnvFactory
                //@Resource(mappedName = "jms/MyEnvFactory")
                private ConnectionFactory connectionFactory;
               
                //@Resource(mappedName = "jms/MyEnvQueue")
                private Queue queue;
 
                JMSContext mJmsContext;
                JMSConsumer mJmsConsumer;
               
                ArrayList<MyModel> mModel;
                private static MySingleton mMySingleton;
               
                private MySingleton() {
                               // TODO Auto-generated constructor stub
                               try {
                                               Context context = new InitialContext();
                                               connectionFactory = (ConnectionFactory) context.lookup("jms/MyEnvFactory");
                                               queue = (Queue) context.lookup("jms/MyEnvQueue");
                                                                             
                               } catch (NamingException e) {
                                               // TODO Auto-generated catch block
                                               e.printStackTrace();
                               }
                              
                              
                               mJmsContext = connectionFactory.createContext();
                               mJmsConsumer = mJmsContext.createConsumer(queue);
                              
                               mModel = new ArrayList<>();
 
                               mJmsConsumer.setMessageListener(new MyAsynchMessageListener());
                }
               
                public static MySingleton newInstance(){
                               if (mMySingleton == null){
                                               mMySingleton = new MySingleton();
                               }
                               return mMySingleton;
                }
 
                public void addModel(MyModel model) {
                               // TODO Auto-generated method stub
                               mModel.add(model);
                }
               
                public ArrayList<MyModel> getModels(){
                               return mModel;
                }
               
 
}
 



Сама модель так
Код: java
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.
public class MyModel implements Serializable{
 
                private String mString;
                private int mInt;
               
                public MyModel() {
                               // TODO Auto-generated constructor stub
                }
 
                public String getString() {
                               return mString;
                }
 
                public void setString(String string) {
                               mString = string;
                }
 
                public int getInt() {
                               return mInt;
                }
 
                public void setInt(int i) {
                               mInt = i;
                }
               
               
 
}
 



Листенер выглядит тка
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class MyAsynchMessageListener implements MessageListener {
 
                MySingleton mMySingleton;
               
                public MyAsynchMessageListener() {
                               // TODO Auto-generated constructor stub
                               mMySingleton = MySingleton.newInstance();
                }
 
                @Override
                public void onMessage(Message message) {
                               // TODO Auto-generated method stub
                               //MyModel model = (MyModel) message;
                               //mMySingleton.addModel(model);
                }
               
}
 



в результате запуска сервлета он долго долго долго думает
и валится вот с такой ошибкой
Код: plaintext
com.sun.messaging.jms.MQRuntimeException: MQRA:DCF:allocation failure:createConnection:Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections

куда копать дальше?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Servlet'а прочитать асинхронно сообщение из JMS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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