我们有 .NET 应用程序,它使用 XMS API 从各种队列中读取数据。对于这个特定的应用程序,我们从 3 个队列中读取数据,并且每隔一段时间就会在 3 个队列中的 2 个队列上收到带有原因代码 2003 的错误。所有 3 个队列都设置为具有持久消息。
从我研究的所有内容来看,似乎是一个长时间运行的事务被回滚导致了这个错误。长时间运行的事务被回滚的原因似乎是日志空间耗尽。当事务回滚时,它会将我们之前读取的消息放入队列中,因此我们最终会读取重复的消息。
在 API 中,当我们创建“会话”以从队列中读取数据时,我们为 transacted 参数指定 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);