IBM MQ同步点和dotnet

跳线蛋糕

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

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

乔希·麦克

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

在几页的IBM MQ KC中对此进行了记录:

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

断开();

...

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

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

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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章