0

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

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

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

我怎样才能做到这一点?队列,主题?点对点还是发布订阅?什么确切的设置可以做到这一点?

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

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

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

4

1 回答 1

2

如果您需要将消息寻址到特定客户端,可以使用消费者端选择器,这是一个往返示例:

服务器发送

 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();

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

如果 queuereceiver 'John-123' 没有连接,发送给他的任何消息都会简单地堆积在队列中。如果您想实时接收消息,则需要始终连接接收器。要间歇性地检查消息(有点像每天检查几次电子邮件),创建接收器、检查消息然后断开连接并没有太多开销,但是,避免重复这样做(1000 次或更多) ; 如果是这种情况,请始终保持接收器连接。

希望有帮助,

于 2013-08-14T04:41:25.103 回答