我需要一种设置,可以将消息传输到由2个或更多服务器监听的队列或主题。
消费者是一个特定的客户端,他将访问这两个服务器中的一个,并且不知道客户端将检查哪个服务器。邮件上会有一个与正确客户端相关的ID。
任何时候都可能有多条消息等待访问这些服务器的各种客户端消费。
我怎样才能做到这一点?队列,主题?点对点或发布订阅?这个技巧会有什么确切的设置?
这是查看场景的另一种方式:想象一下有多个社区邮箱的城镇。这些城镇的居民没有特定的地址,而是在城镇之间不断移动。有人需要向另一个人发送消息,因此他们创建邮件并将其复制并路由到每个城镇的邮箱等待接收。当合适的人检查并找到发给他的消息时,消息将被消耗并销毁在所有其他邮箱上,以确保不再读取相同的消息。
因此,JMS队列或主题是此邮箱,连接到这些服务器的客户端(特别是群集环境中的Web服务器)是人员。发送给不同人的多条消息可以同时存在。
使用JMS最好的方法是什么?
答案 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次或更多次) ;如果是这种情况,请始终保持接收器连接。
希望有所帮助,