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

Я пытаюсь получить сообщение JMS в EJB2 (устаревший отстой;-) сессионный компонент без сохранения состояния в weblogic 10.0.1 с транзакциями, управляемыми компонентом. Определение очереди из папки 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 немедленно возвращает ноль без какой-либо блокировки, независимо от содержимого очереди. Согласно документу JMS API, receiver.receive с тайм-аутом возвращает ноль после тайм-аута или немедленно, если пункт назначения закрыт. Проблема та же, если я использую транзакции, управляемые компонентом, транзакции, управляемые контейнером, или вообще не использую транзакции. Отправка сообщения JMS в другую очередь работает. Прием возвращает нуль немедленно, независимо от того, делаю ли я отправку раньше тем же способом или нет

Почему очередь закрыта или почему так кажется?

К сожалению, MDB не подходит, потому что мы должны туннелировать синхронный вызов через JMS (и я не хочу слишком много дурачиться в Ball of Mud;-)

2 ответа

Решение

Перед MessageConsumer receive = session.createConsumer(responseQueue); положить conn.start();

После создания соединения его необходимо запустить, чтобы перейти в режим приемника. Попробуй это

 ......
 conn = cf.createConnection(); 
 conn.start();
 session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 ......
Другие вопросы по тегам