Weblogic10中的JMS队列EJB2会话bean能够发送但不能接收

时间:2009-09-25 08:22:10

标签: jms weblogic ejb weblogic-10.x ejb-2.x

我尝试在带有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隧道同步调用(我不想在泥球中愚弄太多; - )

2 个答案:

答案 0 :(得分:0)

MessageConsumer receiver = session.createConsumer(responseQueue); conn.start();

答案 1 :(得分:0)

创建连接后,需要启动它才能进入接收模式。 试试这个

 ......
 conn = cf.createConnection(); 
 conn.start();
 session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 ......