我是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,消息将从队列中逐出。问题是没有“接口/回叫”知道消息被驱逐。它只是消失了。或者我错了?
我想到的另一种方法是让线程监视队列并逐出“已过期”的消息并将其从队列中拉出来。但我认为这不可能,是吗?
任何有关此事的光明都会受到重视。
答案 0 :(得分:1)
您必须使用某些特定于实现的功能来满足您的要求。 JMS规范既没有定义对超时消息采取哪种操作,也没有在轮询来自队列的消息时为您提供任何合理的标准选择。
然而,大多数(如果不是全部)JMS实现都提供了DLQ(死信队列)的概念。如果消息无法传递给常规消费者或超时,则JMS实现很可能将消息移动到DLQ,DLQ基本上也是具有自己的侦听器的常规队列。
因此,如果您设置两个队列,Q1和Q2并将Q2配置为Q1的DLQ,您将在Q1上的侦听器中执行正常请求处理,并为Q2执行额外的侦听器以执行错误/超时处理
答案 1 :(得分:0)
JMS上的同步交互可能对您有所帮助。基本上在客户端你:
另一方面,服务器:
因此,在客户端,您始终可以确定发送的消息发生了什么。