IBM XMS .NET设置WMQ_TARGET_CLIENT移除RFH2头时出现无效值异常
问题
我们开发了一款基于.NET的应用,通过IBM XMS库连接IBM MQ。应用运行正常,但生成的消息包含目标应用无法处理的MQRFH2头,因此需要移除该头。根据IBM官方文档,通常可通过设置WMQ_TARGET_CLIENT属性实现此需求,我们尝试在ConnectionFactory中添加如下代码:
IBM.XMS.IConnection connectionWMQ; IBM.XMS.XMSFactoryFactory factoryFactory; IBM.XMS.IConnectionFactory cf; factoryFactory = IBM.XMS.XMSFactoryFactory.GetInstance(IBM.XMS.XMSC.CT_WMQ); cf = factoryFactory.CreateConnectionFactory(); cf.SetStringProperty(IBM.XMS.XMSC.WMQ_HOST_NAME, mqQueueOptions.HostName); cf.SetIntProperty(IBM.XMS.XMSC.WMQ_PORT, mqQueueOptions.Port); cf.SetStringProperty(IBM.XMS.XMSC.WMQ_CHANNEL, mqQueueOptions.Channel); cf.SetIntProperty(IBM.XMS.XMSC.WMQ_CONNECTION_MODE, IBM.XMS.XMSC.WMQ_CM_CLIENT); cf.SetStringProperty(IBM.XMS.XMSC.WMQ_QUEUE_MANAGER, mqQueueOptions.QueueManager); cf.SetIntProperty(IBM.XMS.XMSC.WMQ_CLIENT_RECONNECT_OPTIONS, IBM.XMS.XMSC.WMQ_CLIENT_RECONNECT); cf.SetIntProperty(IBM.XMS.XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT, IBM.XMS.XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT_DEFAULT); cf.SetIntProperty(IBM.XMS.XMSC.WMQ_TARGET_CLIENT, IBM.XMS.XMSC.WMQ_TARGET_DEST_MQ);
但执行时出现如下异常:
Retry 00:00:02 of RetryPolicy-1d242dc3 at , due to: 'IBM.XMS.XMSException: Value 1 not valid for property: targetClient at IBM.XMS.Client.Impl.XmsPropertyContextImpl.SetObjectPropertyInternal(String name, Object value, Boolean validationEnabled) at IBM.XMS.Client.Impl.XmsPropertyContextImpl.SetObjectProperty(String name, Object value) at IBM.XMS.Client.Impl.XmsPropertyContextImpl.SetIntProperty(String name, Int32 value)
请问该问题的原因是什么?
原因分析
- 属性作用范围错误:
WMQ_TARGET_CLIENT属性不能设置在ConnectionFactory上,它的合法作用对象是目标目的地(如队列Queue),而非连接工厂。XMS库会校验每个属性的可设置范围,在ConnectionFactory上设置该属性时,会因超出允许范围抛出参数无效异常。 - 枚举值有效性依赖设置位置:虽然你使用的
WMQ_TARGET_DEST_MQ是正确的枚举值,但由于设置位置不符合XMS的规则,内部无法识别该值对ConnectionFactory的有效性,因此触发了"值无效"的异常提示。
正确做法
在创建IDestination对象后,调用其SetIntProperty方法设置WMQ_TARGET_CLIENT属性,示例代码如下:
// 创建连接和会话后,获取目标队列 ISession session = connectionWMQ.CreateSession(false, AcknowledgeMode.AutoAcknowledge); IDestination destination = session.CreateQueue(mqQueueOptions.QueueName); // 在目的地对象上设置WMQ_TARGET_CLIENT属性 destination.SetIntProperty(XMSC.WMQ_TARGET_CLIENT, XMSC.WMQ_TARGET_DEST_MQ);
这样设置后,XMS发送消息时会自动移除MQRFH2头,适配目标应用的处理需求。
内容的提问来源于stack exchange,提问作者Daniel M.
相关产品推荐
相关产品推荐

