【问题标题】:How to handle situation if message will not come in queue after timeout. Is it possible with Message Broker?超时后消息未进入队列如何处理。消息代理可以吗?
【发布时间】:2017-02-03 04:36:33
【问题描述】:

我想我几乎在标题中描述了我需要的所有内容。所以有一些 WMB 流。一个等待队列中的答案。如果超时后队列中没有消息,我需要抛出异常。

感谢您的宝贵时间

【问题讨论】:

    标签: timeout queue message ibm-mq messagebroker


    【解决方案1】:

    是的,它是可能的,但您需要在您的流程中开发它。 MQ 是为异步通信而设计的,因此超时不是它固有的东西。我现在可以想到两种可能的解决方案:

    • 在您的流程中使用 TimeoutControl 和 TimeoutNotification 节点

    在发送请求的流程中,发送请求后,您添加一个 TimeoutControl 节点并设置所需的超时。 创建一个以 TimeoutNotification 流开始的新流。如果尚未收到响应,则在该流程中发送超时错误。 要知道收到了哪个响应,您可以使用不同的方法,例如发送请求和接收响应的流可以维护一个数据库表,或者您也可以将此信息存储在队列中。

    • 发送请求后开始等待响应

    将响应处理程序流设置为从 MQ 输入开始,然后是 MQ 获取节点。您使用 MQ Get 侦听响应,您可以在其上设置等待间隔,这将是您的超时阈值。 MQ 输入在发送请求后获取请求发送方流发送的技术消息。 这是一个比第一个更糟糕的解决方案,因为您将在侦听响应时阻塞消息流线程。

    或者您可以只创建 1 个流来发送请求并接收响应,使用 MQ Get 节点接收响应。 这更糟糕,因为您需要关闭发送请求的 MQ 输出的事务性。

    【讨论】:

    • 阿提拉,请澄清一件事。如果我们使用第一个场景,我们将有 3 个流程。一个带有请求,一个带有 TimeoutNotification,一个带有响应处理,对吧?示例:请求已完成,收到响应,但计时器将继续运行并向 TimeoutNotification 发送消息。如果我理解正确,那么无论如何都会发送错误。如何避免?
    • 正确,您将有 3 个流程。在您的请求流中,您需要存储您正在等待响应的消息 ID。当您收到响应时,您会删除 id。因此,您的超时流程仅在您使用列表中的 MsgId 超时时发送错误。 TimeoutControl 节点可以存储将发送到 TimeoutNotification 节点的数据,在该数据中,您可以存储开始超时的消息的 MsgId。您正在等待响应的 MsgId 列表可以以最合适的方式存储,例如存储在 DB、Q 或共享变量中。
    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2015-12-16
    • 2011-02-21
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多