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

Weblogic10 EJB2会话bean中的JMS队列能够发送但不能接收,jms,weblogic,ejb,weblogic-10.x,ejb-2.x,Jms,Weblogic,Ejb,Weblogic 10.x,Ejb 2.x,我尝试在WebLogic10.0.1中的EJB2(legacy sucks;-)无状态会话bean中接收JMS消息,并使用bean管理的事务。jms文件夹中的队列定义如下所示 <uniform-distributed-queue name="ReqQueue"> <default-targeting-enabled>true</default-targeting-enabled> <delivery-params-overrides>

我尝试在WebLogic10.0.1中的EJB2(legacy sucks;-)无状态会话bean中接收JMS消息,并使用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>
问题是无论队列的内容如何,
receiver.receive
都会立即返回null,而不受任何阻塞。根据JMS API文档,
receiver.receive
with a timeout在超时后返回null,或者在目标关闭时立即返回null。如果我使用bean管理的事务、容器管理的事务或根本不使用事务,问题也是一样的。将JMS消息发布到另一个队列是有效的。Receive立即返回null,无论我以前是否使用相同的方法发送

为什么队列是关闭的,或者为什么看起来是关闭的

不幸的是,MDB不是一个选项,因为我们必须通过JMS来隧道一个同步调用(我不想在泥潭中浪费太多时间;-)

以前 MessageConsumer receiver=session.createConsumer(responseQueue)
连接开始()

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


我不明白为什么MDB不是一个选项。因为我们想要摆脱EJB在J2EE容器中使用JMS消息的标准方法是使用MDB,这是已知的最简单的EJB2.x。所以我仍然不明白为什么您更喜欢使用更复杂的无状态会话bean(SLSB)。我想摆脱SLSB,但MDB在我看来还行。很抱歉我的第一个评论。你当然是对的。问题在于遗留问题:我们提供了一个由WL10作为SLSB提供的Tuxedo服务。为了摆脱我们应用程序中的所有EJB,我们希望将这个(最后剩下的)SLSB提取到一个独立的应用程序中,并通过JMS从我们的应用程序中隧道它的调用。或者说。糟糕透了。不幸的是,我无法证实这一点,因为整个故事是以不同的方式进行的,问题并没有出现。当检查API文档时,它会说
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);
 ......
 conn = cf.createConnection(); 
 conn.start();
 session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 ......