WebSphere MQ V7 釋出/訂閱技術

CloudSpace發表於2009-04-09

WebSphere MQ V7 釋出/訂閱管理

MQ V7 把釋出/訂閱訊息機制整合到佇列管理器中,這樣做很容易對釋出/訂閱進行管理、配置等操作。可以通過 MQSC 指令碼在命令列管理配置主題和訂閱,也可以通過 MQ Explorer 圖形化的方式管理配置主題和訂閱。

主題的管理

WebSphere MQ V7 把主題作為一種新的物件型別定義在佇列管理器中。主題字串是主題 物件的屬性,它是連線釋出者和訂閱者之間的“紐帶”。

在 MQ V7 佇列管理器內部,主題是以主題樹的繼承形式展現的。圖 2 是一棵主題樹,在 主題樹的最頂端是樹的根節點 SYSTEM.BASE.TOPIC,其他的節點可以分成兩類:一類是管理節點,一類是非管理節點。

管理節點:在主題樹節點中,定義了主題物件的節點被稱為是管理節點,它們是主題樹中永久部分,不會因為佇列管理器重啟被系統刪除掉。管理節點允許在其上定義該節點的屬性,非管理節點可以繼承該屬性。圖2 中 主題 FIFA 所在的節點是管理節點,因為在該節點上定義了主題物件 FOOTBALL 並定義了主題字串 FIFA。

非管理節點:主題字串並不用預先定義,應用程式在釋出或訂閱一個不存在的主題字串時,該主題字串會自動生成,它在主題樹中以非管理節點存在,非管理節點的所有屬都性繼承在它以上的第一個管理節點的屬性。在圖 2 中主題字串 FIFA/EURO 不是預先定義的,它在主題樹中以非管理節點形式存在,它繼承 FIFA 所在管理節點的所有屬性。


圖 2. 主題樹

對於管理節點,需要預先定義主題物件,在 MQ V7 中,可以通過 MQSC 或 MQ Explorer 定義主題物件。清單 1 中使用 MQSC 指令碼命令定義一個主題,主題名字是 WEST, 主題字串是 NBA/LAKER。


清單 1. 定義主題
DEFINE TOPIC(WEST) TOPICSTR(NBA/LAKER) DESCR('This is a TOPIC') PUB(ASPARENT) SUB(
ENABLED) + WILDCARD(PASSTHRU)
1 : DEFINE TOPIC (WEST) TOPICSTR(NBA/LAKER) DESCR('This is a TOPIC') PUB(
ASPARENT) SUB(ENABLED) WILDCARD(PASSTHRU)
AMQ8690: WebSphere MQ TOPIC created.

清單 1 中引數的意義:

TOPIC:主題名字。

TOPIC STR:主題字串。

DESCR:對主題的描述。

PUB:是否允許釋出者在這個主題上釋出訊息,它有三個選項:ENABLED 允許,DISABLED 禁止,ASPARENT 繼承父節點。在圖 3 中,由於 WEST 所在的節點 PUB 屬性是 ASPARENT,並且它的父節點不是管理節點,所以 WEST 所在的節點繼承了根結點 SYSTEM.BASE.TOPIC 的屬性。

SUB:是否允許訂閱者在這個主題上訂閱操作。它有三個選項:ENABLED 允許,DISABLED 禁止,ASPARENT 繼承父節點。

WILDCARD:萬用字元。它有兩個選項:PASSTHRU 和 BLOCK。舉例說明它們的含義:在圖 3 中,若一個訂閱者訂閱主題字串“#”,這會導致在主題樹中所有主題上的釋出內容被髮送到訂閱者。如不希望在 FIFA 以下的節點接收到釋出內容,可以按照清單 2 上的命令修改 WILDCARD 屬性為 BLOCK。WILDCARD 的預設屬性值為 PASSTHRU,沒有 ASPARENT 屬性。


圖 3. 繼承管理節點屬性


清單 2. 修改 WILDCARD 屬性為 BLOCK
ALTER TOPIC(FOOTBALL) WILDCARD(BLOCK)
     4 : ALTER TOPIC(FOOTBALL) WILDCARD(BLOCK)
AMQ8691: WebSphere MQ TOPIC changed.

清單 3 顯示已經定義的主題 FOOTBALL 的資訊。


清單 3. 顯示主題資訊
DISPLAY TOPIC(FOOTBALL)
     5 : DISPLAY TOPIC(FOOTBALL)
AMQ8633: Display TOPIC details.
   TOPIC(FOOTBALL)                         TYPE(LOCAL)
   TOPICSTR(FIFA)                          DESCR( )
   CLUSTER( )                              DURSUB(ASPARENT)
   PUB(ASPARENT)                           SUB(ASPARENT)
   DEFPSIST(ASPARENT)                      DEFPRTY(ASPARENT)
   DEFPRESP(ASPARENT)                      ALTDATE()
   ALTTIME(01.57.11)                       PMSGDLV(ASPARENT)
   NPMSGDLV(ASPARENT)                      PUBSCOPE(ASPARENT)
   SUBSCOPE(ASPARENT)                      PROXYSUB(FIRSTUSE)
   WILDCARD(BLOCK)                         MDURMDL( )
   MNDURMDL( )

清單 4 使用 DISPLAY TOPIC(*) MQSC 命令顯示佇列管理器中所有主題的定義,並用Where 語句根據主題字串的值等於 (EQ) FIFA 對主題過濾,得到符合特定屬性值的主題。


清單 4. 用 WHERE 語句匹配顯示主題資訊
DISPLAY TOPIC(*) WHERE(TOPICSTR EQ FIFA)
     6 : DISPLAY TOPIC(*) WHERE(TOPICSTR EQ FIFA)
AMQ8633: Display TOPIC details.
   TOPIC(FOOTBALL) TYPE(LOCAL)
   TOPICSTR(FIFA)

清單 5 顯示主題字串 FIFA 所在節點的狀態:DISPLAY TPSTATUS(Topic-String)。從返回值中可以看到主題字串“FIFA”的主題名字是 FOOTBALL,這個節點是 ADMIN 及管理節點。


清單 5. 顯示主題字串所在節點的狀態
DIS TPSTATUS(FIFA)
    11 : DIS TPSTATUS(FIFA)
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA)                          ADMIN(FOOTBALL)
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
   PMSGDLV(ALLDUR)                         NPMSGDLV(ALLAVAIL)
   RETAINED(NO)                            PUBCOUNT(0)
   SUBCOUNT(0)                             PUBSCOPE(ALL)
   SUBSCOPE(ALL)

清單 6 使用 DISPLAY TPSTATUS(FIFA/+)返回 FOOTBALL 節點的下一級所有節點的狀態,因為該節點是非管理節點,所以 ADMIN 引數是空。


清單 6. 使用“+”返回主題節點下一級所有節點的狀態
DIS TPSTATUS(FIFA/+)
     2 : DIS TPSTATUS(FIFA/+)
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA/EURO)                     ADMIN( )
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
   PMSGDLV(ALLDUR)                         NPMSGDLV(ALLAVAIL)
   RETAINED(NO)                            PUBCOUNT(0)
   SUBCOUNT(1)                             PUBSCOPE(ALL)
   SUBSCOPE(ALL)

清單 7 使用 DISPLAY TPSTATUS(FIFA/#) 命令不僅返回了 FOOTBALL 節點本身的狀態,還返回了 FOOTBALL 以下所有節點的狀態。


清單 7. 在 DISPLAY TPSTATUS 命令中使用“#”
DIS TPSTATUS('FIFA/#')
    12 : DIS TPSTATUS('FIFA/#')
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA/EURO/ESP)                 ADMIN( )
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA)                          ADMIN(FOOTBALL)
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
   PMSGDLV(ALLDUR)                         NPMSGDLV(ALLAVAIL)
   SUBSCOPE(ALL)
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA/EURO)                     ADMIN( )
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
   PMSGDLV(ALLDUR)                         NPMSGDLV(ALLAVAIL)
   SUBSCOPE(ALL)

值得注意的是,DISPLAY TPSTATUS 命令不支援“*”,但是可以在 WHERE 語句中使用“*”作為過濾條件。清單 8 中命令返回以 FIFA/EURO/E 開頭節點的狀態。


清單 8. WHERE 語句中使用“*”作為過濾條件
DISPLAY TPSTATUS('FIFA/#') WHERE(TOPICSTR LK FIFA/EURO/E*) ALL
     1 : DISPLAY TPSTATUS('FIFA/#') WHERE(TOPICSTR LK FIFA/EURO/E*) ALL
AMQ8754: Display Topic status details.
   TOPICSTR(FIFA/EURO/ESP)                 ADMIN( )
   MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
   MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
   DEFPSIST(NO)                            DEFPRTY(0)
   DEFPRESP(SYNC)                          DURSUB(YES)
   PUB(ENABLED)                            SUB(ENABLED)
   PMSGDLV(ALLDUR)                         NPMSGDLV(ALLAVAIL)
   RETAINED(NO)                            PUBCOUNT(0)
   SUBCOUNT(0)                             PUBSCOPE(ALL)
   SUBSCOPE(ALL)

另外,可以使用 DISPLAY TPSTATUS(‘#’) 返回主題樹中所有節點的狀態,也可以使用DISPLAY TPSTATUS(+) 返回主題樹根結點的狀態。

上面詳細介紹瞭如何使用 MQSC 指令碼命令實現對主題的管理,接下來我們將介紹如何使用 MQ Explorer 和 MQSC 指令碼實現對訂閱的管理。

訂閱的管理

WebSphere MQ V7 提供了兩種管理訂閱的方法,一種是通過 MQ Explorer 管理,另一種是通過 MQSC 命令管理。

使用 MQ Explorer建立訂閱

開啟 MQ V7 Explorer,展開佇列管理器目錄結構,找到被管理的佇列管理器,右擊“Subscriptions”,如圖 4:


圖 4. 建立 Subscription 步驟一

點選“Subscription”開啟建立新的“Subscription”視窗,如圖 5:


圖 5. 建立 Subscription 步驟二

在圖 5 中可以通過 Select 按鈕選擇已經存在的主題,也可以在 Topic Name 和 Topic String 處輸入。引數 Destination Class 有兩個值 Managed 和 Provided,如果選擇 Managed,佇列管理器提供動態佇列作為 Destination。如果選擇 Provided,使用者需要輸入 Destination 值,該值必須是已經存在的佇列。

使用 MQSC 指令碼管理訂閱

WebSphere MQ V7 引入了新的 MQSC 命令定義和管理訂閱。清單 9 使用 DEFINE SUB 命令定義新的訂閱 SUB1,指定 Q1 為 Destination。


清單 9. 使用 MQSC 定義訂閱
DEFINE SUB(SUB1) TOPICSTR(NEWS/SPORTS) DEST(Q1)
     6 : DEFINE SUB(SUB1) TOPICSTR(NEWS/SPORTS) DEST(Q1)
AMQ8094: WebSphere MQ subscription created.

定義 Managed 型別的訂閱可以不用指定 DEST 引數,清單 10 定義了 Managed 型別的 訂閱 SUB2。


清單 10. 定義 Managed 型別訂閱
DEFINE SUB(SUB2) TOPICSTR(NEWS/ENT) DESTCLAS(MANAGED)
     1 : DEFINE SUB(SUB2) TOPICSTR(NEWS/ENT) DESTCLAS(MANAGED)
AMQ8094: WebSphere MQ subscription created.

清單 11 使用 DISPLAY SUB 命令顯示訂閱的定義。


清單 11. 顯示訂閱定義
DIS SUB(SUB2)
     1 : DIS SUB(SUB2)
AMQ8096: WebSphere MQ subscription inquired.
   SUBID(414D5120514D35202020202020202020E3DB4F4920145108)
   SUB(SUB2)                               TOPICSTR(NEWS/ENT)
   TOPICOBJ( )
   DEST(SYSTEM.MANAGED.DURABLE.494FDBE307511420)
   DESTQMGR(QM5)                           PUBAPPID( )
   SELECTOR( )                             USERDATA( )
   PUBACCT(16010515000000B218D7C0694A597186E61BE3F603000000000000000000000B)
   DESTCORL(414D5120514D35202020202020202020E3DB4F4920145108)
   DESTCLAS(MANAGED)                       DURABLE(YES)
   EXPIRY(UNLIMITED)                       PSPROP(MSGPROP)
   PUBPRTY(ASPUB)                          REQONLY(NO)
   SUBSCOPE(ALL)                           SUBLEVEL(1)
   SUBTYPE(ADMIN)                          VARUSER(ANY)
   WSCHEMA(TOPIC)                          SUBUSER(root)

在以上的章節,我們為您講述了 MQ V7 對主題和訂閱這兩個物件的管理。接下來,我們將為您介紹兩種分散式釋出/訂閱結構以幫助您更好的理解 MQ V7 釋出/訂閱技術。

WebSphere MQ V7 分散式釋出/訂閱

MQ V7 中存在兩種分散式釋出/訂閱結構:層次結構釋出/訂閱 (Hierarchical Pub/Sub) 和叢集結構釋出/訂閱 (Clustered Pub/Sub)。在分散式釋出/訂閱網路中,連線在不同佇列管理器上的釋出者和訂閱者通過分散式釋出/訂閱相互通訊,實現訊息傳送和接收。

層次結構釋出/訂閱 (Hierarchical Pub/Sub)

MQ V7 層次結構釋出/訂閱通過佇列管理器“父親”與“孩子”的關係實現,“父親”與“孩子”之間通過雙向通道相互連線,釋出者釋出的訊息通過“父親”佇列管理器路由到“孩子”佇列管理器,最終被訂閱者接收。

通過以下的步驟配置層次結構釋出/訂閱結構:

  1. “父親”佇列管理器與“孩子”佇列管理器之間需要建立雙向通道,定義通道的傳輸佇列的名字為遠端佇列管理器的名字。
  2. 修改“孩子”佇列管理器 PARENT 屬性,設定它的值為“父親”佇列管理器的名字:ALTER QMGR PARENT() 。
  3. 使用 DISPLAY PUBSUB TYPE() 顯示在層次結構釋出/訂閱結構中“父親”或“孩子”佇列管理器的狀態,確認是否建立成功。

值得注意的是:每個“孩子”佇列管理器只能有一個“父親”,使用 ALTER QMGR PARENT命令更改“孩子”佇列管理器的“父親”,一旦這個命令生效,“孩子”佇列管理器就會與原來的“父親”斷開連線,並向新的“父親”發出連線請求。如果要完成與新的“父親”佇列管理器的連線,還需要在“父親”和“孩子”之間建立雙向通道。使用 ALTER QMGR PARENT(‘ ’) 命令,可以把佇列管理器從層次結構中斷開。

下面通過例項講解訊息在層次結構佇列管理器中的傳遞過程。根據上面的步驟 1-3 定義佇列管理器的層次結構,其中包含三個佇列管理器 HQM1,HQM2,HQM3。HQM1 是 HQM2 和 HQM3 的“父親”,如圖 6 :


圖 6. 層次結構釋出/訂閱

在 HQM3 中定義主題 T1 ,主題字串是 /T1。當有 Subscriber 在/T1 上訂閱的時候,HQM3 會傳送 Proxy Subscription (代理型別訂閱) 到與其相連的佇列管理器中,本例中代理型別訂閱先被髮送到 HQM1 中,用 MQSC命令檢視 HQM1 中的代理型別訂閱的定義:

DIS SUB(*) WHERE(TOPICSTR EQ '/T1')  SUBTYPE(PROXY) ALL

從該命令的返回可以看出:在 HQM1 中,代理型別訂閱的 Destination 佇列管理器是HQM3,Destination 是 SYSTEM.BROKER.DEFAULT.STREAM,這說明代理型別訂閱從 HQM3 傳送到 HQM1 的 SYSTEM.BROKER.DEFAULT.STREAM 中。

代理型別訂閱會被 HQM1 傳送到與其相連的 HQM2 中,在 HQM2 可以用同樣的MQSC 命令檢視代理型別訂閱的定義:

DIS SUB(*) WHERE(TOPICSTR EQ '/T1')  SUBTYPE(PROXY) ALL

從該命令的返回可以看出:在 HQM2 中,代理型別訂閱的 Destination 佇列管理器是HQM1,Destination 仍是 SYSTEM.BROKER.DEFAULT.STREAM,這說明這個代理型別訂閱已經被傳送到 HQM2。

當釋出者在 HQM2 上向 /T1 釋出訊息,訊息會被在 HQM2 上的代理型別訂閱放到它的 Destination 中,即 HQM1 的 SYSTEM.BROKER.DEFAULT.STREAM,這一過程是通過 HQM2 和 HQM1 之間的通道傳輸佇列實現的。同理,在 HQM1 上訊息會被取走放到 HQM3 的 SYSTEM.BROKER.DEFAULT.STREAM 中。最後,訊息被連線到 HQM3 上的 Subscriber 消費掉。

從上面的例項可以看出,釋出/訂閱訊息在層次結構中傳遞主要依靠於代理型別訂閱,通道和傳輸佇列。

叢集結構釋出/訂閱 (Clustered Pub/Sub)

MQ V7 叢集結構釋出/訂閱使用叢集的方式實現佇列管理器之間連線,在叢集佇列管理器上定義叢集型別主題,這樣就建立了叢集結構釋出/訂閱。與傳統的叢集類似,叢集結構釋出/訂閱的佇列管理器也是多對多關係。不同點在於,在傳統的叢集中,叢集型別的物件必須在定義完之後才能使用,比如對叢集佇列進行 Put/Get 訊息操作,這個叢集佇列必須預先定義。在叢集結構釋出/訂閱中,叢集主題會在第一次使用它的時候自動定義,在主題樹中生成的節點是非管理節點。當訂閱者在叢集主題上註冊後,代理型別訂閱會被髮送到叢集結構釋出/訂閱中所有的佇列管理器,這個過程會自動定義通道,所以叢集結構釋出/訂閱更像是每個佇列管理器都通過自動定義的通道與其他所有的佇列管理器相連。

舉例說明這個過程:定義叢集 MSG,包含 QM1,QM2,QM3,QM4,其中 QM1 和 QM2 是儲存庫,在 QM1 上定義叢集主題 SPORTS,主題字串是 /GLOBAL/SPORTS。這樣,這個叢集 MSG 就形成了叢集結構釋出/訂閱,如圖 7,Subscriber在 QM3 上註冊主題字串 /Global/Sports,會在 QM3 中動態生成一個訂閱,它是 API 型別。QM3 會向叢集中其他的佇列管理器傳送代理型別訂閱,清單 12在 QM4 上顯示代理型別訂閱的定義,可以看出代理型別訂閱的名字是 SYSTEM.PROXY.QM3 MSG /GLOBAL/SPORTS,傳送代理型別訂閱佇列管理器的名字是 QM3,叢集的名字是 MSG ,主題字串是 /GLOBAL/SPORTS。


圖 7. 叢集結構釋出/訂閱


清單 12. 顯示代理型別訂閱定義

D:\>runmqsc QM4
5724-H72 (C) Copyright IBM Corp. 1994, 2008.  ALL RIGHTS RESERVED.
Starting MQSC for queue manager QM4.
dis sub(*) subtype(proxy) all
     1 : dis sub(*) subtype(proxy) all
AMQ8096: WebSphere MQ subscription inquired.
   SUBID(414D5120514D3320202020202020202033E2434920000EA1)
   SUB(SYSTEM.PROXY.QM3 MSG /GLOBAL/SPORTS)
   TOPICSTR(/GLOBAL/SPORTS)                TOPICOBJ( )
   DEST(SYSTEM.INTER.QMGR.PUBS)            DESTQMGR(QM3)
   PUBAPPID( )                             SELECTOR( )
   USERDATA( )
   PUBACCT(16010515000000B218D7C0694A597186E61BE3F003000000000000000000000B)
   DESTCORL(000000000000000000000000000000000000000000000000)
   DESTCLAS(PROVIDED)                      DURABLE(YES)
   EXPIRY(UNLIMITED)                       PSPROP(MSGPROP)
   PUBPRTY(ASPUB)                          REQONLY(NO)
   SUBSCOPE(ALL)                           SUBLEVEL(1)
   SUBTYPE(PROXY)                          VARUSER(FIXED)  

如果釋出者在 QM4 上向 /GLOBAL/SPORTS 釋出訊息,訊息會被代理型別訂閱傳送到 QM3 中的 SYSTEM.INTER.QMGR.PUBS 佇列裡,訂閱者取出該資料並消費掉。同理,在 QM1 或 QM2 上向 /GLOBAL/SPORTS 釋出訊息,訊息會以同樣的方式傳遞到 QM3,然後被訂閱者消費掉。

由此可見,叢集結構釋出/訂閱中訊息的傳遞方式主要是依靠叢集佇列管理器,這一點與層次結構有著明顯的區別。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-586917/,如需轉載,請註明出處,否則將追究法律責任。

相關文章