Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 单个ActiveMQ会话上的多个使用者_Multithreading_Activemq_Quartz Scheduler_Daemon - Fatal编程技术网

Multithreading 单个ActiveMQ会话上的多个使用者

Multithreading 单个ActiveMQ会话上的多个使用者,multithreading,activemq,quartz-scheduler,daemon,Multithreading,Activemq,Quartz Scheduler,Daemon,我有一个java应用程序,我需要一些帮助来验证我到目前为止所做的工作!。 应用程序具有Quartz守护进程,配置为每200ms运行一次,以轮询ActiveMQ队列中的消息,守护进程的处理时间约为每条消息的2-3分钟,当守护进程触发器触发时,另一个线程启动守护进程任务轮询另一条消息,并并行处理多达50个线程,所有线程都使用与ActiveMQ相同的连接和会话,ActiveMQ在其中配置了默认的预回迁大小 您认为这个实现有什么问题吗? 谢谢 假设您喜欢当前的设计,并且只关心实现,那么我看到的唯一关心的

我有一个java应用程序,我需要一些帮助来验证我到目前为止所做的工作!。 应用程序具有Quartz守护进程,配置为每200ms运行一次,以轮询ActiveMQ队列中的消息,守护进程的处理时间约为每条消息的2-3分钟,当守护进程触发器触发时,另一个线程启动守护进程任务轮询另一条消息,并并行处理多达50个线程,所有线程都使用与ActiveMQ相同的连接和会话,ActiveMQ在其中配置了默认的
预回迁
大小

您认为这个实现有什么问题吗?
谢谢

假设您喜欢当前的设计,并且只关心实现,那么我看到的唯一关心的原因是对
javax.jms.Session
的任何可能的并发访问。
会话
不是线程安全的,因此不应同时被多个线程访问。
javax.jms.Connection
是线程安全的,因此不必担心。只为每个消费者创建一个会话可能更安全/更简单。会话非常轻量级,因此我不会期望任何真正的性能下降

<>为了避免会话并发问题,您甚至可以考虑使用连接池(例如,基于ActuMeq的连接池实现)。 如果您开始遇到消费者饥饿问题,那么预回迁大小可能会成为一个问题,但您没有指出您的消息量将是多少,因此很难说这是否会成为一个问题。要记住两件事:

  • 信息量越大,消费者挨饿的可能性就越小
  • 消费者处理消息的时间越长,其预取大小应越小
相应地调整预取大小


关于总体设计,我不得不认为
javax.jms.MessageListener
实现在这里会更好。单个MessageListener可以获取消息并将其传递给线程进行处理。这将避免Quartz依赖性和轮询。

感谢您的回答,但是,我应该担心
预回迁的大小吗?此外,我应该创建一个会话池并为每个Quartz线程传递一个会话吗?感谢您的回答,尽管使用一个会话到目前为止没有任何问题,我发现我可以在从Q获取消息的方法上使用锁来防止线程安全问题,关于预取,我将值改为1,这意味着没有预取,因为它导致了OutOfMemory问题,因为存储在客户端的消息和处理花费了大量时间,这导致堆被填满,Java应用程序crachLocking是低并发性的合理解决方案。然而,随着并发性的增加,锁争用可能会对性能产生负面影响。这对你来说可能不是问题,但值得记住。谢谢你的帮助,我已经接受了你的答案,非常感谢!