监视队列和使用变量替换

您可以使用 fteCreateMonitor 命令监视队列,并将消息从受监视的队列传输到文件。 可以在任务 XML 定义中替换要从受监视队列中读取的第一条消息中的任何 IBM® MQ 消息属性的值,并用于定义传输行为。

关于本任务

在本示例中,源代理名为 AGENT_VENUS,与 QM_VENUS 连接。 AGENT_VENUS 监视的队列名为 START_QUEUE,位于 QM_VENUS 上。 代理每隔 30 分钟轮询一次队列。

将一组完整的消息写入到队列中时,监视器任务会将这组消息发送到某个目标代理中的文件,这些目标代理均连接到队列管理器 QM_MARS。 将消息组传输到的文件的名称由组中第一条消息的 IBM MQ 消息属性 usr.fileName 定义。 将消息组发送到的代理程序的名称由组中第一条消息的 IBM MQ 消息属性 usr.toAgent 定义。 如果 usr.toAgent 头未设置,那么用于该目标代理的缺省值为 AGENT_MAGENTA。

当指定 useGroups=true 时,如果未同时指定 groupId=${GROUPID},那么仅传输队列中的第一条消息。 例如,如果使用变量替换来生成 fileName,那么 a.txt 的内容有可能不正确。 这是因为 fileName 由监视器生成,但传输实际获取的一条消息并非应生成名为 fileName 的文件的消息。

过程

  1. 创建任务 XML,以定义监视器被触发时应执行的任务。
    <?xml version="1.0" encoding="UTF-8" ?>
    <request version="4.00" 
             xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" 
             xsi:noNamespaceSchemaLocation="FileTransfer.xsd">
       <managedTransfer>
         <originator>
           <hostName>reportserver.com</hostName>
           <userID>USER1</userID>
         </originator>
         <sourceAgent agent="AGENT_VENUS" QMgr="QM_VENUS" />
         <destinationAgent agent="${toAgent}" QMgr="QM_MARS" />
         <transferSet>
           <item mode="binary" checksumMethod="none">
             <source>
               <queue useGroups="true" groupId="${GROUPID}">START_QUEUE</queue>
             </source>
             <destination type="file" exist="overwrite">
               <file>/reports/${fileName}.rpt</file>
             </destination>
           </item>
         </transferSet>
       </managedTransfer>
    </request>

    替换为 IBM MQ 消息头的值的变量将以 粗体突出显示。 该任务 XML 保存到文件 /home/USER1/task.xml

  2. 创建一个资源监视器以监视队列 START_QUEUE。
    提交以下命令:
    fteCreateMonitor -ma AGENT_VENUS -mm QM_VENUS -mq START_QUEUE 
                     -mn myMonitor -mt /home/USER1/task.xml 
                     -tr completeGroups -pi 30 -pu minutes -dv toAgent=AGENT_MAGENTA
  3. 用户或程序将一组消息写入队列 START_QUEUE 中。
    此组中的第一条消息设置了以下 IBM MQ 消息属性:
    usr.fileName=larmer
    usr.toAgent=AGENT_VIOLET
  4. 写入整组消息时,会触发监视器。 代理程序将 IBM MQ 消息属性替换为任务 XML。
    这导致任务 XML 转换为:
    <?xml version="1.0" encoding="UTF-8" ?>
    <request version="4.00" 
             xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" 
             xsi:noNamespaceSchemaLocation="FileTransfer.xsd">
       <managedTransfer>
         <originator>
           <hostName>reportserver.com</hostName>
           <userID>USER1</userID>
         </originator>
         <sourceAgent agent="AGENT_VENUS" QMgr="QM_VENUS" />
         <destinationAgent agent="AGENT_VIOLET" QMgr="QM_MARS" />
         <transferSet>
           <item mode="binary" checksumMethod="none">
             <source>
               <queue useGroups="true" groupId="${GROUPID}">START_QUEUE</queue>
             </source>
             <destination type="file" exist="overwrite">
               <file>/reports/larmer.rpt</file>
             </destination>
           </item>
         </transferSet>
       </managedTransfer>
    </request>

结果

这样会执行由任务 XML 定义的传输。 由 AGENT_VENUS 从 START_QUEUE 读取的整组消息会写入到名为 /reports/larmer.rpt 的文件中,该文件位于运行 AGENT_VIOLET 的系统上。

后续操作

将每条消息传输到一个单独的文件
如果要监视某个队列,并将每条消息传输到一个单独的文件,可以使用与本主题中上述方法类似的方法。
  1. 如前所述创建监视器,在 fteCreateMonitor 命令上指定 -tr completeGroups 参数。
  2. 在任务 XML 中指定以下内容:
    <queue useGroups="true" groupId="${GROUPID}">START_QUEUE</queue>
但是,将消息放入源队列时,请勿将其放入 IBM MQ 组中。 将 IBM MQ 消息属性添加到每条消息。 例如,指定 usr.filename 属性,其中每条消息均有唯一的文件名值。 这将有效导致 Managed File Transfer Agent 将源队列上的每条消息视为单独的组。