JMS:我们可以在没有提交或回滚的情况下从OnMessage()中的队列中获取多个消息

时间:2014-08-18 11:56:22

标签: java jms

我正在使用从远程服务器接收JMS消息的JMS客户端。 我正在客户端的onMessage()方法中监听JMS消息。

我面临的问题是,即使在我定期在客户端消费消息时,消息也会在服务器端累积。

我发送rollback()或commit()取决于我在客户端的处理结束。

我有一个查询,当我处理JMS消息并且我没有向队列发送commit()时,我是否可以从服务器获取另一条消息。

请注意,对于处理,我正在等待处理同步块中收到的消息。 我还在处理时是否会收到新消息并且我还没有向队列发送提交?

2 个答案:

答案 0 :(得分:3)

MessageListener #onMessage()作为会话线程的一部分执行, 所以在从onMessage()返回之前你不会收到下一条消息。

通常,如果预计需要更多时间,则不应在onMessage()中处理消息。将消息排入单独的数据结构并让其他线程处理它。

您不必在每条消息后调用commit(),您可以继续接收消息。

没有。在没有调用提交/回滚的情况下接收的消息取决于客户端缓冲区大小 - 通常可在队列/全局配置。

  

请注意,对于处理,我正在等待   处理在同步块中接收的消息。我会的吗?   我正在处理的新消息,我还没有发送提交   到队列?

如果您正在处理onMessage(),则不会收到新消息,因此无需在onMessage()内部使用synchronized块。

答案 1 :(得分:2)

如果您创建了一个会话并创建了一个消息使用者并设置了您的消息监听器实例,那么根据java文档,只有一个消息监听器实例会在任何给定的时间点获取消息,因为会话本身会处理如果为同一会话注册,则在多个侦听器之间进行序列化。

"用于创建消息使用者的会话序列化了在会话中注册的所有消息侦听器的执行。在任何时候,只有一个会话的消息监听器正在运行。"

JMS MessageListeners

"每个会话必须确保它将消息串行传递给侦听器。这意味着分配给同一会话的一个或多个使用者的侦听器可以假定在会话完成最后一次调用之前,不会使用下一条消息调用onMessage方法。 "

JMS MessageListener

简而言之: -

我有一个查询,当我处理JMS消息并且我没有向队列发送commit()时,我是否可以从服务器获取另一条消息。

如果您创建了一个会话,即使您创建了多个侦听器实例,答案也是否定。

但是,如果您创建多个会话并创建消息侦听器的多个实例并注册它们,那么它们可能会在每个会话中同时收到多条消息

另外,对于您正在使用消息但仍然收集消息的问题,您需要创建多个并发会话,这将提高您的消息处理速率,从而减少服务器中消息的累积