2016-01-22 90 views
0

我正在尝试编写MQ客户端,它将抵抗意外情况。 我已创建客户端CLIENT_ACKNOWLEDGE模式:XMS mq client_acknowledge - 分别确认消息

ISession session = conn.CreateSession(false, AcknowledgeMode.ClientAcknowledge); 

在XMS文档存在用于CLIENT_ACKNOWLEDGE信息:

应用程序可以确认收到每个消息 单独,或它可以接收一个批次并仅对其收到的最后一条消息致电 确认方法。当 确认方法被调用时,自上次调用 以来收到的所有消息都被确认。

客户端从队列中提取例如10条消息并将它们写入数据库。

问题是如何在确认每条消息(用于确保消息传递)的情况下设置此模式?

+0

您是否试图做这样的事情:您收到了10条消息,但您只想确认该批处理的一条消息,比如5或8位?如果这样做是不可能的。正如doc所说,XMS将会收到所有收到的消息。 – Shashi

+0

在当前实现中,我确认收到的每个单个消息。我需要确保不会丢失任何消息。如果第5条消息将被查询并出现问题,例如我们失去了第3条(它将与第5条消息一起发送,而不是重新发送) 有什么方法可以确定顺序的顺序吗? – moniuh

回答

1

当消息传递到应用程序时,它是如何丢失的?

既然您正在处理两个资源,为什么不去处理会话或XA事务处理会话。如果更新数据库时出现问题,您可以进行回滚,以便重新传递消息。

更新

在事务处理会话,确认模式没有意义。消息在调用提交时被确认,或者在回滚被调用时被回滚。

如果与IBM MQ队列管理器的连接丢失,则队列管理器会自动回滚所有未提交的消息。所以没有消息丢失。

+0

具有自动确认的基于事务的会话似乎是解决该问题的方法。 请参阅本文档(它适用于Java,但总体思路相同):http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc /q032220_.htm?lang=en 如果在消息处理或写入数据库期间出现任何问题,请执行回滚。如果一切正常,请执行交易。 – MuhKuh

+0

但自动确认消息是否安全?当我以10-50的包的形式获取消息时,如果客户端使用消息(等待或nowait模式)时发生与MQ连接的事件,如何处理所有意外情况以确保没有消息丢失? – moniuh

+0

查看我更新的答案 – Shashi