超时重试消息
Retrying messages with a timeout
我们必须创建一个响应程序作为 windows 服务,它将消息从队列中取出,确认我们收到了消息的发件人,并通过在 5 秒内发回响应来验证它们。在我们从发件人那里得到我们可以处理消息的另一个确认后,我们处理消息并在另一个(5 秒)内将该请求的结果发送回给他们。如果在该周期的任何时候,他们或我们没有从队列中取出消息并在分配的时间内做出响应,则该消息将过期,我们将需要重试该消息。
我们在确定消息何时过期并需要重新发送时遇到了问题。我一直在阅读有关将它们放在 MQMessage 本身的死信 queue, but I'm unsure that the purpose of it matches what we need. The dead-letter queue is not for items which just timeout, but failed in transmission. I've also read about using the Report 选项上以生成报告并可能将其移动到可以监视的不同队列的信息。然后我们需要重试新队列中的项目。
如果我需要监视每条传入和传出消息以确保我们从正在与之通信的其他 MQ 服务器获得响应,那么这是我唯一的两个选择吗?
我会在 MQ 中使用消息过期和 activity 报告来做到这一点,但这并不意味着您的应用程序没有必要记录它们发送和接收的内容。
在您发送的每条消息上,您可以设置一个过期时间(这意味着如果消息在该时间范围之外从队列中删除,则该消息将被丢弃)。并且通过设置在消息被丢弃时获取报告的报告选项,消息的发送者(实际上你可以为报告指定任何队列而不仅仅是发送者监控的队列)将得到一个报告消息来标识被丢弃的消息,这然后可以重新发送。
但是丢弃的消息不会被放入任何队列,发送应用程序需要能够从头开始重新发送消息。
而处理端,当它等待第二条消息时,它需要有自己的 "timer" 来处理超时。
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.dev.doc/q097490_.htm
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.mon.doc/q036600_.htm
综上所述,在我看来,您没有按预期使用 MQ,而是试图模仿同步通信。 MQ 可以保证恰好一次交付,所以我想说,如果您在应用程序之间有正确配置和大小的 MQ 路由并正确设置消息监视,那么所有这些 ack/nack 都是不必要的。
我们必须创建一个响应程序作为 windows 服务,它将消息从队列中取出,确认我们收到了消息的发件人,并通过在 5 秒内发回响应来验证它们。在我们从发件人那里得到我们可以处理消息的另一个确认后,我们处理消息并在另一个(5 秒)内将该请求的结果发送回给他们。如果在该周期的任何时候,他们或我们没有从队列中取出消息并在分配的时间内做出响应,则该消息将过期,我们将需要重试该消息。
我们在确定消息何时过期并需要重新发送时遇到了问题。我一直在阅读有关将它们放在 MQMessage 本身的死信 queue, but I'm unsure that the purpose of it matches what we need. The dead-letter queue is not for items which just timeout, but failed in transmission. I've also read about using the Report 选项上以生成报告并可能将其移动到可以监视的不同队列的信息。然后我们需要重试新队列中的项目。
如果我需要监视每条传入和传出消息以确保我们从正在与之通信的其他 MQ 服务器获得响应,那么这是我唯一的两个选择吗?
我会在 MQ 中使用消息过期和 activity 报告来做到这一点,但这并不意味着您的应用程序没有必要记录它们发送和接收的内容。
在您发送的每条消息上,您可以设置一个过期时间(这意味着如果消息在该时间范围之外从队列中删除,则该消息将被丢弃)。并且通过设置在消息被丢弃时获取报告的报告选项,消息的发送者(实际上你可以为报告指定任何队列而不仅仅是发送者监控的队列)将得到一个报告消息来标识被丢弃的消息,这然后可以重新发送。
但是丢弃的消息不会被放入任何队列,发送应用程序需要能够从头开始重新发送消息。
而处理端,当它等待第二条消息时,它需要有自己的 "timer" 来处理超时。
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.dev.doc/q097490_.htm
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.mon.doc/q036600_.htm
综上所述,在我看来,您没有按预期使用 MQ,而是试图模仿同步通信。 MQ 可以保证恰好一次交付,所以我想说,如果您在应用程序之间有正确配置和大小的 MQ 路由并正确设置消息监视,那么所有这些 ack/nack 都是不必要的。