監視佇列及使用變數替代

您可以使用 fteCreateMonitor 指令來監視佇列,並將訊息從受監視佇列傳送至檔案。 在第一個要從受監視佇列讀取的訊息中,任何 IBM® MQ 訊息內容的值都可以在作業 XML 定義中替代,並用來定義傳送行為。

關於此作業

在此範例中,來源代理程式稱為 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 讀取的完整訊息群組,會寫入 AGENT_VIOLET 執行時所在系統上稱為 /reports/larmer.rpt 的檔案。

下一步

將每一個訊息傳送至個別檔案
如果要監視佇列並讓每則訊息傳送至個別檔案,您可以使用與本主題中先前所述方式相似的技術。
  1. 依照先前說明來建立監視器,並在 fteCreateMonitor 指令上指定 -tr completeGroups 參數。
  2. 在作業 XML 中指定下列內容:
    
    <queue useGroups="true" groupId="${GROUPID}">START_QUEUE</queue>
不過,當您將訊息放入來源佇列時,請不要將它們放置在 IBM MQ 群組中。 將 IBM MQ 訊息內容新增至每一則訊息。 例如,您可以為每一個訊息指定具有唯一檔案名稱值的 usr.filename 內容。 這實際上會導致 Managed File Transfer Agent 將來源佇列上的每一則訊息視為個別群組。