Java onMessage()中的长串:如何处理?我希望线程调用此方法

Java onMessage()中的长串:如何处理?我希望线程调用此方法,java,multithreading,concurrency,jms,activemq,Java,Multithreading,Concurrency,Jms,Activemq,我在接收JMS消息时做了一些重大的修改,超时的风险很高 对我来说,使用JMS的全部意义在于允许异步完成此类计算。(我不希望我的另一个消费者阻止,如果他们中的一个阻止,我不希望我的制作人阻止,永远)理想情况下,我还希望我的消费者能够在计算第一条消息时接收第二条消息 现在,我正在使用unique发送和使用我的消息。 我知道这是个错误。如文件所述: 会话可以创建和服务多个消息生产者和消费者 而且: 若客户机希望一个线程生成消息,而其他线程则使用消息,那个么客户机应该为其生成线程使用单独的会话 解决方案

我在接收JMS消息时做了一些重大的修改,超时的风险很高

对我来说,使用JMS的全部意义在于允许异步完成此类计算。(我不希望我的另一个消费者阻止,如果他们中的一个阻止,我不希望我的制作人阻止,永远)理想情况下,我还希望我的消费者能够在计算第一条消息时接收第二条消息

现在,我正在使用unique发送和使用我的消息。 我知道这是个错误。如文件所述:

会话可以创建和服务多个消息生产者和消费者

而且:

若客户机希望一个线程生成消息,而其他线程则使用消息,那个么客户机应该为其生成线程使用单独的会话

解决方案可以是为生产者使用会话,为每个消费者使用不同的会话,但消费者一次只能处理一条消息

据我所知,Jms提供者(在我的例子中是ActiveMq)调用了onMessage方法。任何配置都允许在多个线程中调用此调用吗?

也许这个问题反映了我在理解如何使用JMS/我的概念时存在的主要缺陷。请随意讨论;)

谢谢

编辑:

用一句话来说我的问题:

  • 如果我有2个消费者,并且其中一个消费者需要很长时间来处理onMessage,那么所有其他消费者都将阻塞
今天做了什么:我使用的是a,但我不太喜欢这个解决方案。我在Tomcat应用服务器环境中,已经使用了太多的线程,我想将这一职责委托给一组更健壮的代码。(例如:activeMq)

编辑2:

更多详情:

  • 我不使用事务会话

  • 我使用Auto_Acknoledge


您应该简单地将繁重的事务简化为一个可以在一个事务中处理的流程


我帮不了你,因为你没有提到这件叛变是关于什么的。

你的描述很难理解,我认为这不是语言问题。我最大的理解是,您的制作人正在阻止,因为消费者需要很长时间来处理消息。如果为true,则表示您在处理消息后使用持久消息和显式确认

如果是这种情况,两种可能的解决方案是:(1)确定您是否真的需要保证,如果不需要,则使用隐式确认和/或非持久性消息,或者(2)可靠地将消息存储在消费者中,确认,然后处理消息


根据您的编辑,简短的回答是“是的,您可以生成线程”。由于生产者不关心消费者是否能够实际处理消息,因此您在处理消息方面有很大的灵活性

我怀疑ActiveMQ有一些属性允许您控制消息处理线程的数量。我还没有广泛使用它(更喜欢HornetQ),所以不能给出一个明确的答案

然而,即使是这样,我还是更喜欢使用Java
ThreadPoolExecutorService
(我想这就是它的名字;请参阅
Java.util.concurrent
)。主要原因是它提供了自己的内部工作队列。无论您为消息传递框架提供了多少线程,都有可能有足够的工作将它们绑定起来。使用
ExecutorService
,您将继续接收和排队消息,直到内存耗尽为止(如果出现这种情况,您需要解决一些设计问题)。

及以下(MessageConsumer、MessageProducer)是单线程的。如果需要任何多线程处理,则需要多个会话。每个消费者一个会话


每个耗电元件都是单线程的。但是,如果一个JMS实现是从多个会话创建的,那么它应该能够在多个消费者之间传递多线程消息。

Hi,一个恶意的chrome插件已经删除了我文章中的所有“a”和“the”。有趣的虫子。:)我已经编辑了我的问题,我希望它更清楚now@Antoine-编辑提供了有用的信息,特别是编辑2。答案相应更新。感谢您的编辑。实际上,我已经在使用消费者端的执行器来处理超时和较长的处理时间。但我对这个解决方案不是很满意,据我所知,这应该是JMS提供者的责任。我将在activeMq.com中查找“numberOfMessageProcessingThread”配置值。多个会话看起来是一件需要做的事情。但是如果我有一个唯一的单线程消费者,有几个会话呢。(JMS订阅的一个会话)