代码之家  ›  专栏  ›  技术社区  ›  Peter Kofler

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

  •  0
  • Peter Kofler  · 技术社区  · 15 年前

    我尝试在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>
    

    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 立即返回空值,不受任何阻塞,不管队列的内容如何。根据JMS API文件, 接收 如果超时,则在超时后返回空值,如果目标已关闭,则立即返回空值。如果我使用bean管理的事务、容器管理的事务或者根本没有事务,那么问题是相同的。将JMS消息发布到另一个队列可以工作。无论我以前是否用相同的方法发送,receive都会立即返回空值。

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

    不幸的是,MDB不是一个选项,因为我们必须通过JMS挖掘一个同步调用(我不想在泥球中愚弄太多;-)

    2 回复  |  直到 12 年前
        1
  •  0
  •   Costin Arsene    15 年前

    以前 messageconsumer receiver=session.createConsumer(responsequeue); CON.STATE();

        2
  •  0
  •   Vikdor    12 年前

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

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