spring-boot - 在 JMS 队列监听器 onMessage 方法中运行异步代码
问题描述
在我的应用程序中,我将 JMS 消息发布到代表要执行的任务的队列中。当onMessage
调用监听器的方法时,我需要执行的任务自动运行在自己的线程中,所以它是异步的。
该应用程序是在 Spring Boot 上编写的,我使用 Kubernetes 进行容器编排,以便动态调整工作进程的数量。
我已经看到了实现这种工作队列和 JMS 侦听器模式的示例,并且我总是看到在方法内部调用同步onMessage
方法。
所以,我的问题是:等到异步操作完成后再返回onMessage
回调会更好吗?
谢谢
解决方案
在侦听器线程上执行异步处理通常不是一个好主意。
如果要增加并发,请改为增加容器的并发(创建多个消费者)。
如果出于某种原因您必须异步,您应该暂停侦听器线程直到进程完成,以避免在发生故障时丢失消息。
此外,如果您退出侦听器,您可能会在当前消息完成之前收到一条新消息。即使使用 CLIENT_ACKNOWLEDGE,您也可以无序地确认消息,或者您必须跟踪未确认的消息。
通常,在侦听器线程上执行工作更简单。
推荐阅读
- java - Hibernate - 按列分组,收集到列表和限制
- c# - 为什么我的相机使用 lerp 挡在两个位置之间?
- python - NumPy 如何组装一个数组?
- amazon-sqs - 如何使用 MassTransit 通过消息值实现节流?(后端是 SNS/SQS 但很灵活)
- manim - 如何让多个点围绕一个圆圈匀速移动?
- c# - Telerik RadRichTextBox:如何更改代码块中的字体大小?
- python - 为什么使用 sklearn RandomForestRegressor 对多个目标的预测有时总和为 1?
- angular - 带有 Observable 的 Angular 路由器防护在页面刷新后不起作用
- javascript - 为什么我需要在 D3 中为 Tooltip 和 Brush 使用自定义事件?
- javascript - 将大量数据从 API 导入 Contentful?