默认情况下,使用 WebSphere MQ 配置部署的资产会将传入请求 MQ 消息中的 MQMD characterSetmessageIdcorrelationId 复制到传出响应 MQ 消息中。这是默认的关联机制。

如果需要使用其他关联机制,例如让虚拟资产将传入请求的 messageId 复制到传出响应的 correlationId 中,则可以在消息响应器级别进行配置。操作步骤:

  1. 将消息头数据库工具与该响应器的传入头请求链接,并提取 messageId(或所需 MQMD 字段)值(请参阅Header 数据库)。
  2. 在消息响应器传输消息头选项中,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 记录向导。

  • No labels