2016-01-24 67 views
0

假设一个JMS消息得到了在JMS客户端接收器onMessage方法。代理(IBM MQ)位于其他JVM上。在此之后 - JMS客户端的JVM崩溃了(在ACKNOWLEDGE发布之前)。JMS客户端的JVM粉碎 - 客户确认模式

我使用的客户端进行确认。没有交易。

请问经纪人得到异常(有什么异常?)当客户端崩溃了? 消息是否会留在队列中? 消息是否会重新传递以及何时/如何?

回答

1

首先IBM MQ不会在JVM上运行。 IBM MQ队列管理器运行时包含一组协调的进程。

队列管理器进程并不确认客户端应用程序终止,并不会清理。

使用CLIENT_ACKNOWLEDGE模式时,IBM MQ JMS客户端从SYNC_POINT下的队列中检索消息,因此消息不会从队列中删除,直到应用程序确认为止。消息将在应用程序恢复时重新传递,即调用connection.start()方法。但是,如果退出计数超过退出阈值(BOTHRESH),则不会将消息重新发送给应用程序。在这种情况下,如果定义了消息,消息将被移动到撤销队列(BOQNAME)。如果由于某种原因消息不能移动到退出队列,则消息将被移至队列管理器上定义的死信队列(DLQ)。

+0

我使用的是春天的JMS连接池。所以每个消息的连接都没有关闭/打开。每条消息都有一个新的会话。因此,在一条消息未被确认之后,在我重新启动我的应用程序之前它不会重新传送?这是不够的..也许有一种方法来检查每个消息到达,如果队列中有未传递的消息,并要求提供它们? – user5157427

+0

由于使用CLIENT_ACKNOWLEDGE模式接收到消息,因此必须确认将其从队列中删除。如果它没有被确认,并且应用程序没有调用session.close()方法,则消息不可见于其他消费者,因此不能传递给其他消费者。 – Shashi