我有一个Java应用程序,我需要一些帮助来验证到目前为止所做的工作!。
该应用程序具有Quartz守护程序,该守护程序配置为每200ms运行一次以从ActiveMQ队列中轮询消息,该守护程序的处理时间约为每条消息2-3分钟,当该守护程序触发器触发时,另一个线程启动该守护程序任务以轮询另一条消息并最多并行处理50个线程,所有线程都使用与ActiveMQ相同的连接和会话,在该会话中,ActiveMQ被配置为默认Prefetch
大小。
您认为此实现有什么问题吗? 谢谢!
答案 0 :(得分:0)
假设您喜欢当前的设计,而您只关心实现,那么我在这里关心的唯一原因是javax.jms.Session
的任何可能的并发访问。 Session
不是线程安全的,因此绝对不能同时有多个线程访问它。 javax.jms.Connection
是线程安全的,因此不必担心。为每个消费者创建一个会话可能更安全/更简单。会话非常轻巧,因此我不希望任何实际的性能下降。
为避免会话并发问题,您甚至可以考虑使用连接池(例如基于ActiveMQ的连接池实现的PooledJMS)。
如果您开始遇到消费者饥饿问题,则您的预取大小可能会成为问题,但是您并未指出消息量将是多少,因此很难确定是否会出现这种情况。是否有问题。请记住两件事:
相应地调整您的预取大小。
关于总体设计,我不禁想到这里使用javax.jms.MessageListener
实现会更好。单个MessageListener可以获取消息并将它们传递给线程进行处理。这样可以避免Quartz依赖性和轮询。