您可以使用 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 的文件的消息。
过程
- 创建任务 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
- 创建一个资源监视器以监视队列 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
- 用户或程序将一组消息写入队列 START_QUEUE 中。
此组中的第一条消息设置了以下
IBM MQ 消息属性:
usr.fileName=larmer
usr.toAgent=AGENT_VIOLET
- 写入整组消息时,会触发监视器。 代理程序将 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 的系统上。
后续操作
将每条消息传输到一个单独的文件
如果要监视某个队列,并将每条消息传输到一个单独的文件,可以使用与本主题中上述方法类似的方法。
- 如前所述创建监视器,在 fteCreateMonitor 命令上指定 -tr
completeGroups 参数。
- 在任务 XML 中指定以下内容:
<queue useGroups="true" groupId="${GROUPID}">START_QUEUE</queue>
但是,将消息放入源队列时,请勿将其放入
IBM MQ 组中。 将
IBM MQ 消息属性添加到每条消息。 例如,指定
usr.filename 属性,其中每条消息均有唯一的文件名值。 这将有效导致
Managed File Transfer Agent 将源队列上的每条消息视为单独的组。