Ibm mq IBM MQ syncpoint和dotnet

Ibm mq IBM MQ syncpoint和dotnet,ibm-mq,Ibm Mq,在尝试使用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 s

在尝试使用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,我希望每次都能看到相同的消息。队列管理器上是否需要启用某些功能?

在您的示例中,您没有发出
Commit()
Backout()
,因此此时消息将处于未提交状态。如果随后关闭进程,消息将回滚到队列。正如您在注释中提到的,如果调用
Disconnect()
,在大多数情况下,这将隐式提交未提交的消息

IBM MQ KC中有几页对此进行了说明:

断开连接()

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

注意:
由.NET管理
表示分布式事务,而不是您正在做的事情

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

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

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


在您的示例中,您没有发出
Commit()
Backout()
,因此此时消息将处于未提交状态。如果随后关闭进程,消息将回滚到队列。正如您在注释中提到的,如果调用
Disconnect()
,在大多数情况下,这将隐式提交未提交的消息

IBM MQ KC中有几页对此进行了说明:

断开连接()

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

注意:
由.NET管理
表示分布式事务,而不是您正在做的事情

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

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

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


您需要崩溃/终止程序或调用回滚。现在您只是持有一条未提交的消息。啊,这是有道理的,我正确地关闭了(queue.Close()和queueManager.Disconnect())。当我删除它们时,我可以在多次运行后看到相同的消息。如果你把你的回复作为答案,我会把它标记为acceptedAnswer,并在主题文档中添加一些要点。你需要崩溃/终止你的程序或调用回滚。现在您只是持有一条未提交的消息。啊,这是有道理的,我正确地关闭了(queue.Close()和queueManager.Disconnect())。当我删除它们时,我可以在多次运行后看到相同的消息。如果你把你的回答作为一个答案,我会标记为已接受的回答,并在该主题的文档中附上一些要点。