1

在尝试使用 c# 和 ibm mq 客户端(9.1.5)时,我想使用同步点功能。

var getMessageOptions = new MQGetMessageOptions();
getMessageOptions = new MQGetMessageOptions();
getMessageOptions.Options += MQC.MQGMO_WAIT + MQC.MQGMO_SYNCPOINT;
getMessageOptions.WaitInterval = 20000;  // 20 seconds wait
Hashtable props = new Hashtable();
props.Add(MQC.HOST_NAME_PROPERTY, "localhost");
props.Add(MQC.CHANNEL_PROPERTY, "DOTNET.SVRCONN");
props.Add(MQC.PORT_PROPERTY, 3636);
MQQueueManager qm = new MQQueueManager("QM", props);
MQQueue queue = qm.AccessQueue("Q1", MQC.MQOO_INPUT_AS_Q_DEF);

try
{
    var message = new MQMessage();
    queue.Get(message, getMessageOptions);

    string messageStr = message.ReadString(message.DataLength);

    SaveTheMessageToAFile(messageStr);
    //qm.Commit();

}
catch (MQException e) when (e.Reason == 2033)
{
   // Report exceptions other than "no messages in the queue"
     Log.Information("No messages in the queue");   
}
catch (Exception ex)
{
  Log.Error($"Exception when trying to capture a message from the queue: 
}

如果我不调用 commit,我本来希望每次都能看到相同的消息。队列管理器是否需要启用某些功能?

4

1 回答 1

0

在您的示例中,您没有发出 aCommit()或 a Backout(),因此此时消息将处于未提交状态。如果您要终止您的进程,则消息将回滚到队列中。正如您在评论中提到的,如果您调用Disconnect(),在大多数情况下,这将隐式提交未提交的消息。

这在 IBM MQ KC 中的几页中有记录:

参考>开发应用程序参考>IBM MQ .NET 类和接口>MQQueueManager.NET 类

断开();

...

通常,作为工作单元的一部分执行的任何工作都已提交。但是,如果工作单元是managed by .NET,则工作单元可能会回滚。

注意: managed by .NET表示分布式事务,而不是您正在做的事情。

开发应用程序>开发 .NET 应用程序

当您使用过程接口时,您可以通过调用断开与队列管理器的连接,其中是队列管理器的句柄。MQDISC( Hconn, CompCode, Reason)Hconn

在 .NET 接口中,队列管理器由 MQQueueManager 类的对象表示。Disconnect()您可以通过调用该类上的方法断开与队列管理器的连接。

开发应用程序>使用 IBM MQ 开发 MQI 应用程序>编写用于排队的过程应用程序>提交和退出工作单元>IBM MQ 应用程序中的同步点注意事项

除了在带有 RRS 的 z/OS 批处理上,如果程序在有未提交的请求时发出 MQDISC 调用,则会出现隐式同步点。 如果程序异常结束,就会发生隐式退出。

于 2020-05-20T01:38:59.793 回答