Очередь JMS в сеансовом компоненте Weblogic10 EJB2, способном отправлять, но не получать

StackOverflow https://stackoverflow.com/questions/1476070

Вопрос

Я пытаюсь получить сообщение 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); 
 ......
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top