Ibm mq IBM MQ syncpoint和dotnet
在尝试使用c#和ibm mq客户端(9.1.5)时,我希望使用同步点功能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
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())。当我删除它们时,我可以在多次运行后看到相同的消息。如果你把你的回答作为一个答案,我会标记为已接受的回答,并在该主题的文档中附上一些要点。