Очередь 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);
......