IBM WebSphere MQ消息通道的配置和維護(四)

在所有平台上,都有一個特殊的觸發監控器叫做通道啟動器(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…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營