我尝试在带有bean管理事务的weblogic 10.0.1中的EJB2(遗留项目;-)无状态会话bean中接收JMS消息。 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>
bean中的业务方法不会启动事务,因此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消息发布到另一个队列可以正常工作。无论我之前是否使用相同的方法进行发送,接收都会立即返回null。
为什么队列已关闭,或者为什么会这样呢?
不幸的是,MDB不是一个选项,因为我们必须通过JMS隧道同步调用(我不想在泥球中愚弄太多; - )
答案 0 :(得分:0)
在 MessageConsumer receiver = session.createConsumer(responseQueue); 放 conn.start();
答案 1 :(得分:0)
创建连接后,需要启动它才能进入接收模式。 试试这个
......
conn = cf.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
......