gpt4 book ai didi

java - 使用 JMS 满足此需求的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-02 06:49:33 25 4
gpt4 key购买 nike

我需要一种设置,可以将消息传输到由 2 个或更多服务器监听的队列或主题。

消费者是一个特定的客户端,它将访问这两个服务器之一,并且提前不知道客户端将从哪个服务器进行检查。该消息上将有一个与正确客户端相关联的 ID。

随时可能有多条消息等待访问这些服务器的各个客户端使用。

我怎样才能做到这一点?队列,主题?点对点还是发布订阅?什么样的具体设置可以实现这个技巧?

这是看待该场景的另一种方式:想象多个城镇都有一个社区邮箱。这些城镇的居民没有具体的地址,而是不断地在城镇之间移动。有人需要向另一个人发送消息,因此他们创建邮件,然后将其复制并路由到每个城镇的邮箱等待接收。当正确的人检查并找到发给他的邮件时,该邮件将在所有其他邮箱上被使用和销毁,以确保不会再次读取相同的邮件。

因此,JMS 队列或主题就是这个邮箱,而连接到这些服务器(特别是集群环境中的 Web 服务器)的客户端就是人。发给不同人的多条消息可以同时存在。

使用 JMS 执行此操作的最佳方法是什么?

最佳答案

如果您需要将消息发送给特定客户端,则可以使用消费者端选择器,下面是一个往返示例:

服务器发送

 QueueSender queueSender = queueSession.createSender(queue);
queueSender.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage message = queueSession.createTextMessage("Hello John!");
message.setObjectProperty("ToAddress", "John-123");
queueSender.send(message);

消费者收到

 QueueConnection queueConn = connFactory.createQueueConnection();
QueueSession queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver queueReceiver =
queueSession.createReceiver(queue, "ToAddress = 'John-123'");
queueConn.start();
TextMessage message = (TextMessage) queueReceiver.receive();

客户端使用选择器ToAddress=John-123创建一个queueReceiver,因此只有与该选择器匹配的消息才会传递到该客户端;其他消息根据选择器发送给不同的消费者。

如果队列接收器“John-123”未连接,则发送给他的任何消息都会积聚在队列中。如果您想实时接收消息,则接收者需要始终保持连接。要间歇性地检查消息(有点像每天检查几次电子邮件),创建接收器、检查消息然后断开连接不会产生太多开销,但是,请避免重复执行此操作(1000 次或更多) ;如果是这种情况,请始终保持接收器连接。

希望有帮助,

关于java - 使用 JMS 满足此需求的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com