自定义轮询与JMS MessageListener

时间:2014-01-14 06:36:41

标签: performance java-ee jms activemq hornetq

很抱歉,如果是重复的问题。

我有一个遗留的Web应用程序,它使用队列(是的。普通的Java队列)和自定义轮询(每500毫秒)。将调用REST Web服务(/ message),如果有任何其他空字符串,将返回该消息。

我的需求:如果Queue中有任何消息可用,则在实时中,客户端应该收到消息。所以我可以节省500毫秒。

从当前的方法迁移到JMS有什么好处吗?从这个链接JMS MessageConsumer's messageListener makes push or pull?来看,MessageListener(进程是异步的)使用与当前方法没有区别的轮询。

如果它是基于供应商的,HornetQ / ActiveMQ如何支持MessageListener?

编辑: 该队列用于集成两个系统。一个网络应用程序& standlone java program。

2 个答案:

答案 0 :(得分:2)

使用基于推送的模型实现Async MessageListener。在ActiveMQ中,代理根据其设置的预取值向客户端发送许多消息,以便消息可以使用。这是否有助于您的特定用例是您需要自己回答的问题。

答案 1 :(得分:1)

接收或MessageListener将是异步的,并在收到消息后立即调用。

您可以控制客户端的预取大小。

现在,如果您只需要避免每隔500毫秒进行一次极化延迟,那么使用队列系统可能是一种过度杀伤力?使用java.util.Queue(或任何其他子类)是完美的。

如果您需要阻止直到java.util.Queue的一个元素可用,并且您不需要分布式消息传递,持久性或任何类似的东西,您可以简单地使用BlockingDequeue,并且您的线程将在您取消阻止时立即取消阻止有消息..

看看这个:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingDeque.html