【发布时间】:2020-05-28 18:15:17
【问题描述】:
我们必须创建一个响应者应用程序作为 Windows 服务,它将消息从队列中取出,确认发送者我们收到了它们,并通过在 5 秒内发送回响应来验证它们。在我们从发件人那里得到另一个确认我们可以处理该消息后,我们处理该消息并在另一个(5 秒)内将该请求的结果发送回给他们。如果在该周期的任何时候,他们或我们没有将消息从队列中取出并在分配的时间内做出响应,则消息将过期,我们将需要重试消息。
我们无法确定消息何时过期并需要重新发送。我一直在阅读有关将它们放在死信queue 上的信息,但我不确定它的目的是否符合我们的需要。死信队列不适用于刚刚超时但传输失败的项目。我还阅读了有关在 MQMessage 本身上使用 Report 选项来生成报告并可能将其移动到可以监控的不同队列的信息。然后我们需要重试新队列中的项目。
如果我需要监控每条传入和传出消息以确保我们从正在与之通信的其他 MQ 服务器获得响应,那么我只有这两个选择吗?
【问题讨论】:
-
您应该在代码中构建响应/确认逻辑,而不是希望以某种方式配置 MQ 基础架构来帮助您。
-
我将使用基于 2 表数据库的机制来执行此操作。第一个表将保存来自 Q 的消息。第二个表将保存 Okay to Process 消息。我将有一个进程/线程扫描 MQ 以获取消息。选择消息并将其插入到相关表中。如果它转到第一个表,则以 ACK 消息响应。
-
另一个进程/线程将继续查看第二个表中的新记录并处理第一表中的相应消息。如果需要,写回 ACK 以确认消息已处理。稳健性 - 理想情况下,我会从队列中窥视一条消息,确定它去哪个表,写入该表,然后提交/告诉 Q 删除该消息。这样我就可以防止消息在飞行中丢失。
-
@PrateekShrivastava 这是我们最初的想法之一,但是随着这些表的大小增加,从它们中选择数据然后确定要写入哪个表/要更新哪个记录所需的时间,我们可能非常接近我们强加给我们的时间限制。我们正在努力寻找一种方法来尽可能缩短处理/等待时间。
-
@JoshMc 这些是客户提出的要求。他们在每一步都需要承认。我想原因是因为消息中有货币交易。
标签: c# .net websphere ibm-mq message-queue