【问题标题】:JMS Timeout or TimeToLiveJMS 超时或 TimeToLive
【发布时间】:2013-10-31 19:32:09
【问题描述】:

我对 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,消息将从队列中逐出。问题是没有“接口/回调”来知道消息被驱逐了。它只是消失了。还是我弄错了?

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

我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 正是我想要的。我会试一试,但它显然是特定于实现的。我相信这是 EE API 规范忽略的一个领域。
    【解决方案2】:

    通过 JMS 进行同步交互也可能对您有所帮助。基本上在客户端你:

    1. 发送带有关联 ID 和生存时间的消息
    2. 使用相同的关联 ID 接收消息(通常在同一个线程中)并指定超时(生存时间 == 超时,因此如果您将其视为已死,则它真的已死)

    另一边,服务器:

    1. 在传入消息中必须获取相关 ID
    2. 在将响应发送回客户端时为响应指定该关联 ID。 当然,服务器必须足够快以适应超时/生存时间阈值。

    因此,在客户端,您始终可以确定发送的消息发生了什么情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多