JMS超时或TimeToLive

时间:2011-09-23 08:41:22

标签: java java-ee jms java-ee-6

我是Java EE和JMS的新手,我正在考虑使用JMS进行实现。

考虑以下情况:

方案

用户点击servlet。然后将消息从此servlet放入JMS服务器/队列。然后将响应发送回用户说“消息队列”。

选项1

使用者/ MDB从JMS队列接收消息并对其进行处理。这是正常的操作,非常标准。

选项2

没有消费者(无论什么原因)或接收者处理消息的速度太慢。所以我想要的是队列中的消息超时。一旦超时,应发送电子邮件等(电子邮件仅作为示例)。

阅读我在QueuSender类中找到的API规范/ Java EE 6教程

void send(Message message, int deliveryMode, int priority, long timeToLive) 

因此,通过设置timeToLive,消息将从队列中逐出。问题是没有“接口/回叫”知道消息被驱逐。它只是消失了。或者我错了?

我想到的另一种方法是让线程监视队列并逐出“已过期”的消息并将其从队列中拉出来。但我认为这不可能,是吗?

任何有关此事的光明都会受到重视。

2 个答案:

答案 0 :(得分:1)

您必须使用某些特定于实现的功能来满足您的要求。 JMS规范既没有定义对超时消息采取哪种操作,也没有在轮询来自队列的消息时为您提供任何合理的标准选择。

然而,大多数(如果不是全部)JMS实现都提供了DLQ(死信队列)的概念。如果消息无法传递给常规消费者或超时,则JMS实现很可能将消息移动到DLQ,DLQ基本上也是具有自己的侦听器的常规队列。

因此,如果您设置两个队列,Q1和Q2并将Q2配置为Q1的DLQ,您将在Q1上的侦听器中执行正常请求处理,并为Q2执行额外的侦听器以执行错误/超时处理

答案 1 :(得分:0)

JMS上的同步交互可能对您有所帮助。基本上在客户端你:

  1. 发送带有相关ID和生存时间的消息
  2. 使用相同的相关ID接收消息(通常在同一个线程中)并指定超时(生存时间==超时,所以如果你把它当死,它真的死了)
  3. 另一方面,服务器:

      传入消息的
    1. 必须获取相关ID
    2. 在将响应发送回客户端时指定响应的相关ID。 当然,服务器必须足够快,以适应超时/生存时间阈值。
    3. 因此,在客户端,您始终可以确定发送的消息发生了什么。