什么是使用JMS满足此要求的最佳方式

时间:2013-08-13 20:05:51

标签: java jms

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

消费者是一个特定的客户端,他将访问这两个服务器中的一个,并且不知道客户端将检查哪个服务器。邮件上会有一个与正确客户端相关的ID。

任何时候都可能有多条消息等待访问这些服务器的各种客户端消费。

我怎样才能做到这一点?队列,主题?点对点或发布订阅?这个技巧会有什么确切的设置?

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

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

使用JMS最好的方法是什么?

1 个答案:

答案 0 :(得分: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次或更多次) ;如果是这种情况,请始终保持接收器连接。

希望有所帮助,