Очередь JMS в сеансовом компоненте Weblogic10 EJB2, способном отправлять, но не получать
-
16-09-2019 - |
Вопрос
Я пытаюсь получить сообщение JMS в EJB2 (устаревший отстой;-) сеансовый компонент без состояния в weblogic 10.0.1 с управляемыми bean транзакциями.Определение очереди из папки jms выглядит следующим образом
<uniform-distributed-queue name="ReqQueue">
<default-targeting-enabled>true</default-targeting-enabled>
<delivery-params-overrides>
<delivery-mode>Non-Persistent</delivery-mode>
</delivery-params-overrides>
<quota>QuotaCrc</quota>
<jndi-name>xxx.ReqQueue</jndi-name>
<load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>
<uniform-distributed-queue name="RespQueue">
<default-targeting-enabled>true</default-targeting-enabled>
<delivery-params-overrides>
<delivery-mode>Non-Persistent</delivery-mode>
</delivery-params-overrides>
<quota>QuotaCrc</quota>
<jndi-name>xxx.RespQueue</jndi-name>
<load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>
Бизнес-метод в компоненте не запускает транзакцию, поэтому операции JMS не являются транзакционными.Выполняемый код является
InitialContext ictx = new InitialContext();
QueueConnectionFactory cf = (QueueConnectionFactory)
ictx.lookup("weblogic.jms.ConnectionFactory");
Queue responseQueue = (Queue) ictx.lookup("RespQueue");
conn = cf.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer receiver = session.createConsumer(responseQueue);
ObjectMessage response = (ObjectMessage) receiver.receive(30000);
Проблема в том, что receiver.receive
возвращает null немедленно без какой-либо блокировки, независимо от содержимого очереди.Согласно документу JMS API., receiver.receive
с таймаутом возвращает null после таймаута или сразу, если пункт назначения закрыт.Проблема та же, если я использую транзакции, управляемые bean, транзакции, управляемые контейнером, или вообще никаких транзакций.Отправка сообщения JMS в другую очередь работает.Receive немедленно возвращает null, независимо от того, выполняю ли я отправку ранее тем же методом или нет.
Почему очередь закрыта, или почему это так кажется?
К сожалению, MDB - это не вариант, потому что нам приходится туннелировать синхронный вызов через JMS (и я не хочу слишком много валять дурака в этом грязном шаре ;-)
Решение
До того , как Получатель MessageConsumer = session.createConsumer(ответный запрос); положить conn.start() конн.старт();
Другие советы
После того как вы создадите соединение, его необходимо запустить, чтобы перейти в режим приемника.Попробуй это
......
conn = cf.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
......