在所有平台上,都有一個特殊的觸發監控器叫做通道啟動器(Channel Initator),它的作用就是啟動通道。
2.2.2 觸發類型
l EVERY:
應用隊列中每接受到一個消息時,都將產生觸發消息。如果應用程序僅僅處理一個消息就結束,可採用這種觸發類型。
l FIRST:
應用隊列中消息從0變為1時會觸發事件。如果當隊列中的一個消息到達時啟動程序,直到處理完所有消息才結束,則採用這種觸發類型。
l DEPTH:
應用隊列中消息數目和TriggerDepth(引起觸發事件發生時,隊列中的消息數目)屬性值相同時,才會產生觸發事件。當一系列請求的回復都收到時,才啟動應用程序,則可以採用這種方法。
需要注意的時,當DEPTH屬性值為0的時候,實際上就形成了同步通信。另外,當採用Depth觸發時,產生觸發消息以後,隊列將被修改為非觸發方式,如果需要再次觸發,需要重新設置成允許觸發。
一般而言,在實際應用中,如果通道設置成觸發方式,觸發類型往往設置成為FIRST和DEPTH。
2.2.3 觸發器工作流程
1) 本地或遠程應用程序A,往應用隊列(Application Queue)中PUT了一條消息。
2) 如果隊列的觸發類型設置為first,當隊列原來深度為0時(隊列為空),這時PUT一條消息到隊列中將形成觸發事件,同時產生一條觸發消息,觸發消息中將包含進程定義中的信息,因為進程定義中包含啟動程序B所需的信息,所以觸發消息中也包含了啟動程序B所需的信息。
3) 隊列管理器創建觸發消息,並把它PUT入與應用隊列相關的啟動隊列Initiation Queue。
4) 觸發監控器(Trigger Monitor)從啟動隊列(Initiation Queue)中GET觸發消息。
5) 觸發監控器處理觸發消息,發出啟動應用程序B的命令。
6) 應用程序B打開應用隊列(Application Queue),並處理隊列中的消息。
註:如果是通道觸發將可以不需要創建進程對象(process object),只是在傳輸隊列的trigdata中設置需要啟動的通道名。
2.2.4 配置消息通道觸發
配置消息通道觸發啟動,需要使用到的對象有傳輸隊列,通道啟動隊列,發送通道,通道啟動器。我們本配置案例中傳輸隊列名是QMB,通道啟動隊列採用SYSTEM.CHANNEL.INITQ,發送通道名QMA.QMB,通道啟動器為runmqchi,該進程在隊列管理器啟動的時候自動啟動。下面我們通過舉例來演示配置實現消息通道觸發啟動。
l 首先我們來查看一下傳輸隊列QMB都有哪些屬性,顯示如下清單所示,其中清單中的標註紅色的屬性和通道觸發配置相關。
| dis ql(QMB)
1 : dis ql(QMB) AMQ8409: 顯示隊列細節。 QUEUE(QMB) TYPE(QLOCAL) ACCTQ(QMGR) ALTDATE(2009-02-06) ALTTIME(11.41.44) BOQNAME( ) BOTHRESH(0) CLUSNL( ) CLUSTER( ) CLWLPRTY(0) CLWLRANK(0) CLWLUSEQ(QMGR) CRDATE(2008-12-05) CRTIME(10.37.53) CURDEPTH(0) DEFBIND(OPEN) DEFPRTY(0) DEFPSIST(NO) DEFSOPT(SHARED) DEFTYPE(PREDEFINED) DESCR( ) DISTL(YES) GET(ENABLED) HARDENBO INITQ( ) IPPROCS(1) MAXDEPTH(5000) MAXMSGL(4194304) MONQ(QMGR) MSGDLVSQ(PRIORITY) TRIGGER NPMCLASS(NORMAL) OPPROCS(1) PROCESS( ) PUT(ENABLED) QDEPTHHI(80) QDEPTHLO(20) QDPHIEV(DISABLED) QDPLOEV(DISABLED) QDPMAXEV(ENABLED) QSVCIEV(NONE) QSVCINT(999999999) RETINTVL(999999999) SCOPE(QMGR) SHARE STATQ(QMGR) TRIGDATA( ) TRIGDPTH(1) TRIGMPRI(0) TRIGTYPE(FIRST) USAGE(XMITQ) |
l 設置傳輸隊列為觸發模式TRIGGER。
l 設置觸發類型為every/first/depth其中的一種,例如TRIGTYPE(FIRST)。如果設置為TRIGTYPE(DEPTH),則還需要設置觸發深度屬性,例如TRIGDPTH(4),表示當隊列中的消息數由3個增加到4個的時候才能形成觸發事件,但需要注意的是深度觸發事件只能產生一次事情,下次傳輸隊列的消息數由3個增加到4個時候不會產生觸發事件,所以在消息通道觸發中,我們推薦採用TRIGTYPE(FIRST)。
l 在通道觸發中,推薦使用SYSTEM.CHANNEL.INITQ隊列作為初始隊列, 該隊列為MQ專用的通道啟動隊列, 不需要手工啟動其觸發監視器,設置傳輸隊列INITQ(SYSTEM.CHANNEL.INITQ )屬性。
l 通過TRIGDATA屬性設置需要觸發的通道名,例如TRIGDATA(QMA.QMB )。
l 對於TRIGMPRI屬性的含義是基於消息優先級觸發,也即某類優先級的消息滿足的觸發條件才產生觸發事件,我們在消息通道觸發中不推薦使用。
完整MQSC命令參考如下:
| ALTER QL(QMB) +
TRIGGER + TRIGTYPE(FIRST) + INITQ(SYSTEM.CHANNEL.INITQ) + TRIGDATA(QMA.QMB)
|
l 通道的觸發監控器我們採用系統的自帶的runmqchi程序,缺省隊列管理器啟動的時候,runmqchi進程會自動啟動。
以下文章點擊率最高
Loading…