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

标签 java jms

我需要一种设置,可以将消息传输到由 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/

相关文章:

java - 带有尾递归的堆栈溢出

Log4j 中的 Java 转换模式问题

java - 将值添加到 double[] arraylist

java - 尝试将消息推送到 Activemq 时出现 NamingException

jms - HornetQ 2.2.5 嵌入示例异常

java - JMS 动态创建主题

java - 我应该使用 SceneBuilder 还是在代码中实现布局?

Java:从多个方法中创建通用方法

java - 如何序列化一个文件和另一个对象

java - 如何在不使用 jconsole 的情况下确保 JMS 监听器启动?