我正在学习JMS并想知道JMS客户端(例如MessageListener)如何注意它注册的队列中的新消息。是否经常通过TCP向代理发送请求以查看是否有新消息?如果是这样,这个请求是同步还是异步?
答案 0 :(得分:1)
1)首先,JMS
没有名为绝对同步消息的内容。你绝对可以通过实现同步服务方法来实现所谓的JMS Synchronous messaging
,但事实上它似乎只是模仿Synchronous messaging
。实际上它也是Async Messaging
。
2)从技术上讲,JMS Server / Broker
通过专用的队列将消息发送到Message Consumers
。 Broker
只是将消息传递给Message Consumer's
onMessage()
方法。然后Container
执行onMessage()
方法。
答案 1 :(得分:1)
JMS只是一个API。它没有指定任何线路级协议。所以你无法真正告诉客户端如何与代理商合作。对于我们所知道的,它可以使用归巢的piegon。好吧,也许不是,但像WebSphere MQ和ActiveMQ这样的经纪人都提供内存传输和基于TCP的。
大多数供应商都拥有自己的专有协议,即使AMQP作为有线协议标准可见(但远非所有供应商都开始关注它)。
在谈论TCP时,只要有实时连接,就不需要轮询。代理可以轻松地通知客户端在客户端休眠时发布了新消息,反之亦然。
然而,常见的方法是实际进行民意调查。而是在较长的间隔(秒)内轮询consumer.receive(TIMEOUT);
。这使得在spring等框架中使用分布式事务成为可能。代理仍然会根据需要向客户端发送实际的TCP消息。
如果不是这样,那么JMS / Messaging就不会是如此快速,广泛的psread和可扩展技术