IBM XMS .NET - 接收错误 - 原因代码2003

时间:2013-12-06 15:54:11

标签: .net ibm-mq xms

我们有.NET应用程序,它使用XMS API从各种队列中读取。对于这个特定的应用程序,我们从3个队列中读取,并且经常在3个队列中的2个队列中收到错误,原因码为2003。所有3个队列都设置为具有持久消息。

从我研究的所有内容看来,正在回滚的长时间运行的事务导致此错误。回滚长时间运行事务的原因似乎来自耗尽的日志空间。当事务被回滚时,它将我们先前读取的消息放入队列中,因此我们最终会读取重复项。

在API中,当我们创建“Session”以从队列中读取时,我们为事务参数指定false。因此,我们永远不会在会话上调用“提交”。我们还在会话中使用自动确认模式。这让我相信我们没有明确地分析任何类型的工作单元,但是可能存在某种隐式事务吗?棘手的部分是我们能够在3个队列中的1个队列中正常读取,而不会收到错误。

关于我可以在哪里查看解决此类问题的任何想法?

创建连接:

cf.SetStringProperty(XMSC.WMQ_HOST_NAME, hostName);
cf.SetIntProperty(XMSC.WMQ_PORT, port);
cf.SetStringProperty(XMSC.WMQ_CHANNEL, channelName);
cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);
cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, managerName);
cf.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, EncryptionSettings.SSLRepositoryPath);
cf.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC, EncryptionSettings.CipherType);
cf.SetIntProperty(XMSC.WMQ_FAIL_IF_QUIESCE, XMSC.WMQ_FIQ_YES); 

创建会话:

MQConnection.CreateSession(false, AcknowledgeMode.AutoAcknowledge)

创建目的地:

MQSession.CreateQueue(queueName)

创建消费者:

 MQSession.CreateConsumer(MQDestination)

从队列中读取:

var rawMessage = messageConsumer.Receive((long)TimeSpan.FromSeconds(15).TotalMilliseconds);

2 个答案:

答案 0 :(得分:1)

事实证明,有一个内部工作单元没有被提交,这会导致消息在2003或2024故障时在队列中回滚。该问题的解决方案是将WMQ_SYNCPOINT_ALL_GET的MQ连接工厂上的标志设置为true。默认值为false。

设置标志:

SetBooleanProperty(XMSC.WMQ_SYNCPOINT_ALL_GETS, true);

答案 1 :(得分:0)

XMS .NET在本地事务下读取持久性消息,因为会话被创建为非事务和自动确认。这是为了避免在向应用程序传递消息期间丢失任何消息。因此,XMS .NET在内部调用Commit来告诉队列管理器从队列中删除消息。

你的代码很简单,我没有看到问题。

任何队列中是否有格式错误的消息?在达到回退阈值(BOTHRESH)后,具有XMS无法理解的标头的消息将被退回到退出(BOQUEUE)队列。

您是否为从中读取消息的队列定义了回退队列或死信队列?消息是否在回退队列中堆积?

最后,我建议与IBM一起提出PMR来解决问题。