gpt4 book ai didi

java - onMessage() : How to handle ? 中的 Long traitement 我希望线程调用此方法

转载 作者:行者123 更新时间:2023-11-30 09:49:48 26 4
gpt4 key购买 nike

我在接收 JMS 消息时做了一些重特性处理,超时风险很高。

对我来说,使用 JMS 的全部意义在于允许这种计算异步完成。 (如果其中一个消费者阻塞,我不希望我的其他消费者阻塞,我不希望我的生产者阻塞,永远)。 理想情况下,我还希望我的消费者能够在计算第一个消息时接收到第二个消息

现在,我正在使用独特的 javax.jms.Session用于发送和使用我的消息。我知道这是概念错误。作为文档状态:

session can create and service multiple message producers and consumers.

还有:

If client desires to have one thread produce messages while others consume them, client should use separate session for its producing thread.

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

据我了解,onMessage 方法是由 Jms Provider(在我的例子中是 ActiveMq)调用的。任何配置都可以允许在多个线程中调用此调用吗?

也许这个问题反射(reflect)了我对 JMS 应该如何使用/我的概念的理解上的重大缺陷。请随意讨论;)

谢谢!

编辑:

我的问题一句话:

  • 如果我有 2 个消费者,如果其中一个需要很长时间来处理 onMessge,所有其他消费者都会阻塞。

今天做了什么:我正在使用 java.util.concurent.Executor ,但我不是这个解决方案的忠实粉丝。我在 Tomcat 应用程序服务器上下文中,并且已经使用了太多线程,我想将此责任委托(delegate)给一组更健壮的代码。 (例如:activeMq)

编辑 2:

更多细节:

  • 我不使用事务 session

  • 我使用 Auto_Acknoledge

最佳答案

您的描述很难理解,我认为这是语言问题。我最好的理解是您的生产者正在阻塞,因为消费者需要很长时间来处理消息。如果为 true,这意味着您在处理消息后使用持久消息和显式确认。

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


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

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

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

关于java - onMessage() : How to handle ? 中的 Long traitement 我希望线程调用此方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com