【问题标题】:Custom polling vs JMS MessageListener自定义轮询与 JMS MessageListener
【发布时间】:2014-02-02 03:33:15
【问题描述】:

对不起,如果是重复的问题。

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

我的需要:如果队列中有任何消息可用,则客户端应该实时获取消息。所以我可以节省 500 毫秒。

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

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

编辑: 队列用于两个系统的集成。一个网络应用程序和独立的 Java 程序。

【问题讨论】:

    标签: performance jakarta-ee jms activemq hornetq


    【解决方案1】:

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

    【讨论】:

    • 知道HornetQ是如何实现的吗?
    • 从HornetQ论坛我发现它也是推模式。谢谢蒂姆
    【解决方案2】:

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

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

    现在,如果您只需要避免每 500 毫秒轮询一次的延迟,那么使用 Queue 系统可能有点过头了?使用 java.util.Queue(或任何其他子类)非常好。

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

    看看这个:

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

    【讨论】:

    • 队列用于两个系统的集成。我想减少轮询导致的服务器负载(每 500 毫秒大约 10K 轮询)
    猜你喜欢
    • 2010-12-07
    • 2015-10-19
    • 2019-03-13
    • 2022-01-13
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多