默认情况下,使用 WebSphere MQ 配置部署的资产会将传入请求 MQ 消息中的 MQMD characterSet
、messageId
和 correlationId
复制到传出响应 MQ 消息中。这是默认的关联机制。
如果需要使用其他关联机制,例如让虚拟资产将传入请求的 messageId
复制到传出响应的 correlationId
中,则可以在消息响应器级别进行配置。操作步骤:
- 将消息头数据库工具与该响应器的传入头请求链接,并提取
messageId
(或所需 MQMD 字段)值(请参阅Header 数据库)。 - 在消息响应器传输消息头选项中,MQ(参阅传输消息头选项卡)添加
messageId
(或所需的 MQMD 字段名称),并用请求messageId
或数据库提供的字段对其值进行参数化。此方法可根据需要用于 MQMD MQMessage 字段。- 有关 Virtualize 识别并处理的 MQ Message MQMD 字段名称列表,请参阅 MQMD documentation。
注意,为了让值在数据库和通讯报文视图中具有可读性,Virtualize 将显示字节数组字段的十六进制编码表示。然而,实际的字节内容将从请求优雅地传输到响应消息,以此保护原始字节内容。
在关联中使用 RFH2 头文件,用于具有自定义消息格式的 MQ 消息
对于使用自定义消息格式的 MQ 消息,如果 RFH2 头文件没有明确保留在自定义消息转换器中,则无法在以响应器关联为目的的 XML 消息中对其访问。如果响应器关联需要 RFH2 头文件,则可以通过自定义脚本上下文以 XML 格式的消息字符串的一部分访问它们。
以下 Jython 脚本提供如何实现此任务的示例。它测试请求以查看消息域是否设置为 sampleDomain
,以及应用程序为 sampleKey
定义的属性是否设置为 sampleValue
。
from com.parasoft.api import CorrelationScriptingHookConstants from com.parasoft.xml import XMLUtil from org.w3c.dom import * from javax.xml.xpath import * from java.lang import * def match(context): msg = context.get(CorrelationScriptingHookConstants.MESSAGE_STR) if msg != None: xmlDocument = XMLUtil.buildDocumentFromString(msg) cond1 = matchRFH2Header(xmlDocument, "mcd/Msd", "sampleDomain") cond2 = matchRFH2Header(xmlDocument, "usr/sampleKey", "sampleValue") return cond1 and cond2 return false def matchRFH2Header(xmlDocument, path, val): xPathFactory = XPathFactory.newInstance(); xpath = xPathFactory.newXPath() expression = xpath.compile("/RFH2Message/RFH2Headers/" + path + "/text()") elementValue = expression.evaluate(xmlDocument) return String(elementValue).equals(val)
以下路径可用于访问不同 RFH2 区域的值:
消息内容说明符
- "mcd/Msd" - 消息域
- "mcd/Set" - 消息集
- "mcd/Type" - 消息类型
- "mcd/Fmt" - 输出格式
发布命令和订阅命令
- "psc/Command"
- "psc/Topic"
- "psc/SubIdentity"
- "psc/QName"
- "psc/QMgrName"
- "psc/SubPoint"
- "psc/Filter"
- "psc/SubName"
- "psc/SubUserData"
- "psc/RegOpt"
应用程序定义的属性
- "usr/*"
Java 消息传递服务
- "jms/Dst" - 目的地
- "jms/Rto" - 回复给
- "jms/Tms" - 时间戳
- "jms/Exp" - 有效期
- "jms/Cid" - 关联 d
- "jms/Pri" - 优先性
- "jms/Dlv" - 传递模式
有关使用脚本关联的详情,请参阅自定义关联性。
故障排除
如果消息没有正确关联,则会生成错误消息,或不会响应给消息,检查报头中指示的编码与消息正文中实际使用的编码是否不匹配。如果发生该情况,则您需要使用 JRE 系统属性覆盖预期的消息格式。
例如,如果您的消息头显示 characterSet=37,但实际消息是以 UTF-8 编码的,那么您可以使用以下 JRE 系统属性:
mq.force.utf8.encoding=true
方法是使用后接属性名的 -J-D
启动 Virtualize。例如:
virtualize.exe -J-Dmq.force.utf8.encoding=true
相关属性, mq.force.custom.encoding=UTF-8
,在查看或使用自定义消息格式时(本机 MQ 消息内容和 XML 转换时)应用到 MQ 记录向导。