multithreading - 单个 ActiveMQ 会话上的多个消费者
问题描述
我有一个 java 应用程序,我需要一些帮助来验证我到目前为止所做的事情!该应用程序具有配置为每 200 毫秒运行一次以轮询 ActiveMQ 队列中的消息的 Quartz 守护程序,每条消息的守护程序处理时间约为 2-3 分钟,当守护程序触发器触发时,另一个线程启动守护程序任务以轮询另一条消息并最多并行处理 50 个线程,所有线程都使用与 ActiveMQ 相同的连接和会话,其中配置了默认Prefetch
大小。
你认为这个实现有什么问题吗?谢谢!
解决方案
假设您喜欢当前的设计并且您只关心实现,那么我看到的唯一关心的原因是javax.jms.Session
. 不是线程安全的Session
,所以它不应该被多个线程同时访问。Ajavax.jms.Connection
是线程安全的,所以这不是问题。为每个消费者创建一个会话可能更安全/更简单。会话非常轻量级,所以我不希望任何真正的性能下降。
为了避免会话并发问题,您甚至可以考虑使用连接池(例如,基于 ActiveMQ 连接池实现的PooledJMS )。
如果您开始遇到消费者饥饿问题,您的预取大小可能是一个问题,但您没有说明您的消息量将是多少,因此很难说这是否会成为问题。要记住两件事:
- 消息量越大,消费者挨饿的可能性就越小。
- 消费者处理消息所需的时间越长,其预取大小应该越小。
相应地调整您的预取大小。
关于整体设计,我不禁认为javax.jms.MessageListener
这里的实现会更好。单个 MessageListener 可以获取消息并将它们交给线程进行处理。这将避免 Quartz 依赖以及轮询。
推荐阅读
- ssl - Nginx 拒绝监听 443 端口
- api - 对于 JWT,iat 和 exp 的值应该是多少?
- c++ - 通过 C++ 中向量的大小从特定索引处的向量中检索值
- c# - 如何将值列表反序列化为 C# 对象
- python - Python中的正确子集函数
- dc.js - 不要在 dc.js 数据表中显示零
- python - 使用writerow在python错误中合并具有不同列的多个csv文件
- javascript - 在另一个 html 文件中查看 JavaScript 变量的值
- swift - 使用 swift 从 firebase 加载自定义数据时遇到问题
- url - 有没有办法使用 Mermaid Markdown 流程图将 URL 放在同一个文档中?