2016-04-14 158 views
1

你好我写某种简单的测试场景,我执行下面的源代码:当消息可用时,JMS receiveNoWait()是否保证消息传递?

这里是我的send()方法:

public void send() throws JMSException { 

    Session session = null; 
    MessageProducer producer = null; 

    try { 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

     Destination destination = session.createQueue("TEST.FOO"); 

     producer = session.createProducer(destination); 
     producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 

     byte[] uselessData = new byte[1024]; 

     BytesMessage message = session.createBytesMessage(); 
     message.writeBytes(uselessData); 

     producer.send(message); 

    } finally { 
     producer.close(); 
     session.close(); 
    } 
} 

这是我收到()方法:

public void receive() throws JMSException { 

    Session session = null; 
    MessageConsumer consumer = null; 

    try { 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     Destination destination = session.createQueue("TEST.FOO"); 
     consumer = session.createConsumer(destination); 

     Message hugeMessage = consumer.receiveNoWait(); 

     if (hugeMessage == null) { 
      System.out.println("Message was not received"); 
      unsucsesfullCount++; 
     } else { 
      if (hugeMessage instanceof BytesMessage) { 
       System.out.println("Message received"); 
      } 
     } 
    } finally { 
     consumer.close(); 
     session.close(); 
    } 

} 

我执行:

send(); 
receive(); 

receiveNoWait()总是消息值。

我在这里的问题是receiveNoWait()保证消息传递时,在代理中的消息? send()已成功执行,因此目标中至少有一条消息。

我已经在规范中进行了搜索,但是如果在代理端可用的消息应该由客户端的receiveNoWait()明确地接收,则没有真正清晰的定义。

另外我想问一下,如果receiveNoWait()没有消息可用,它应该引发一些消费者刷新过程中的券商,因此,未来receiveNoWait()将收到消息?

我提供的示例代码在ActiveMQ上运行,但是我的问题比提供者更具概念性,因为我对其他JMS提供者有相同的观察。

回答

2

不,规范并不保证对receiveNoWait的任何调用都会返回一条消息,它可能会,然后又可能不会。使用receiveNoWait时,您必须始终检查空归还并相应采取行动。

在ActiveMQ的情况下,客户端将返回一条消息,如果代理调度了一个消息,并且消费者预取缓冲区中立即可用,否则它只返回空值。

其他实现我确实向代理发送了轮询请求,例如Qpid JMS使用AMQP链接排空请求来请求代理发送任何可用于分派的消息,代理将发送它们或发送信号链接被排空,没有消息准备好。

简而言之,它完全取决于客户和经纪人如何实施receiveNoWait,但无论您总是需要考虑您无法从该方法返回给您的消息的机会。

+0

感谢您的回答蒂姆。我的理解是一样的,但由于规范中缺乏适当的解释,我决定寻找更多意见。 – Altair

+0

仅供参考,有一个针对此标准的旧的未解决的错误报告[澄清Message.receiveNoWait()如何表现](https://java.net/jira/browse/JMS_SPEC-85)。 – user7610