使用两个队列在两个应用程序之间进行通信时如何处理 activeMq 中的响应超时
How to handle response timeout in activeMq when using two queues for communication between two applications
假设您有一个应用程序 A 和一个应用程序 B,它们使用 ActiveMQ 队列一起通信。通信发生如下。
- A使用队列名向应用程序B发送请求消息
com.example.requestQueue
- B从队列名com.example.requestQueue
消费消息请求
- B需要一些时间来处理消息请求,然后发送一个
使用响应队列响应回 B
姓名com.example.responseQueue
- A 使用来自 com.example.responseQueue 队列的响应消息并完成
如果应用程序B一直在接听,就没有问题。
但是,如果由于某种原因,应用程序 B 从请求队列 com.example.requestQueue 中消费了一条消息,并且从不将响应消息放入响应队列 com.example.responseQueue ,应用程序A将永远等待。
请问有什么办法可以解决这种问题吗?
注意:应用程序 A 是用 Java 和 Camel 编写的,应用程序 B 是用 C++ 编写的
谢谢。
Camel 支持单个路由中的请求-回复流(交换模式 InOut),或者您可以根据您的用例将请求-回复分成两个单独的路由(交换模式均为 InOnly)。
请求-回复模式根据使用的 Camel 组件提供超时设置。将超时添加到 Application A Camel 路由请求-回复。
参考:SJMS Component - 较新的 JMS 组件
参考:JMS Component - 原始 JMS 组件
参考:Request Reply pattern - InOut 模式信息
旁注--
如果应用程序 A 也 预期会 return 调用者(即网络应用程序或 REST/SOAP 客户端),那么您希望确保设置消息响应超时低于调用者使用的超时。这允许应用程序 A 在调用者超时发生之前 return 向调用者发送适当的 exception/error。
假设您有一个应用程序 A 和一个应用程序 B,它们使用 ActiveMQ 队列一起通信。通信发生如下。
- A使用队列名向应用程序B发送请求消息 com.example.requestQueue
- B从队列名com.example.requestQueue 消费消息请求
- B需要一些时间来处理消息请求,然后发送一个 使用响应队列响应回 B 姓名com.example.responseQueue
- A 使用来自 com.example.responseQueue 队列的响应消息并完成
如果应用程序B一直在接听,就没有问题。 但是,如果由于某种原因,应用程序 B 从请求队列 com.example.requestQueue 中消费了一条消息,并且从不将响应消息放入响应队列 com.example.responseQueue ,应用程序A将永远等待。 请问有什么办法可以解决这种问题吗?
注意:应用程序 A 是用 Java 和 Camel 编写的,应用程序 B 是用 C++ 编写的
谢谢。
Camel 支持单个路由中的请求-回复流(交换模式 InOut),或者您可以根据您的用例将请求-回复分成两个单独的路由(交换模式均为 InOnly)。
请求-回复模式根据使用的 Camel 组件提供超时设置。将超时添加到 Application A Camel 路由请求-回复。
参考:SJMS Component - 较新的 JMS 组件
参考:JMS Component - 原始 JMS 组件
参考:Request Reply pattern - InOut 模式信息
旁注-- 如果应用程序 A 也 预期会 return 调用者(即网络应用程序或 REST/SOAP 客户端),那么您希望确保设置消息响应超时低于调用者使用的超时。这允许应用程序 A 在调用者超时发生之前 return 向调用者发送适当的 exception/error。