|MQSeries Function 可使用於大範圍的實務手冊。 |本節將討論一些最普遍的實務,包括「基本傳訊」、「應用程式連接」及「資料公布」。
|當所有資料庫應用程式連接到相同的 DB2 伺服器時,會發生 MQSeries DB2 功能的訊息之最基本形式。從屬站可能是資料庫伺服器的本端或分散在網路環境中。
|在簡式實務範例中,從屬站 A 呼叫 MQSEND 功能,傳送使用者定義至預設服務程式位置。 |MQSeries 功能隨後會在資料庫伺服器的 DB2 內執行。 |稍後,從屬站 B 呼叫 MQRECEIVE 功能,移除預設服務程式定義的佇列中之最早記載記錄的訊息,並將其傳回從屬站。 |同樣的,執行此作業的 MQSeries 功能由 DB2 執行。
|資料庫從屬站可以用許多方式來使用簡式傳訊。傳訊的某些一般用法如下: |
|下列實務範例擴充了上述說明的簡式實務範例,以納入遠端傳訊。 |也就是說,訊息在機器 A 與機器 B 之間傳送。 步驟順序如下: |
|使用 MQSEND,DB2 使用者或發展者可選擇要傳送的資料,要傳送的位置,及要傳送的時間。 |在業界中,這通常叫做 "Send and Forget",表示傳送者只要傳送訊息,而依據 MQSeries 的遞送通信協定保證,確保訊息可到達目的地。 |下列範例會對此作說明。
|範例 4︰若要使用原則 highPriority 將使用者定義字串傳送至服務程式點 myPlace:
|VALUES DB2MQ.MQSEND('myplace','highPriority','test')
|在這裡,原則 highPriority 參照 AMI 儲存庫所定義的原則,將 MQSeries 優先順序設定為最高層次, |也可能調整其他服務程式的品質,例如持續性。
|訊息內容可能由 SQL 的任何標準尺寸組合及使用者指定的資料組合而成。 |這包括巢狀功能、運算子及強制轉型。 |例如,提供一表格 EMPLOYEE,有 VARCHAR 直欄 LASTNAME、FIRSTNAME |及 DEPARTMENT,針對每一個 DEPARTMENT 5LGA 中的員工傳送包含此資訊之訊息,您可執行下列:
|範例 5:
|SELECT DB2MQ.MQSEND(LASTNAME || ' ' || FIRSTNAME || ' ' || DEPARTMENT) | FROM EMPLOYEE | WHERE DEPARTMENT = '5LGA'
|若此表格也有一個完整的 AGE 直欄,它可能也會被併入,如下所示:
|範例 6:
|SELECT DB2MQ.MQSEND(LASTNAME || ' ' || FIRSTNAME || ' ' || DEPARTMENT|| ' ' || ch |ar(AGE)) | FROM EMPLOYEE | WHERE DEPARTMENT = '5LGA'
|如果表格 EMPLOYEE 有一個類型為 CLOB 的直欄 RESUME 而沒有 AGE 直欄, |則會傳送一則訊息,其中含有 DEPARTMENT 5LGA 中每一位員工的資訊,如下所示:
|範例 7:
|SELECT DB2MQ.MQSEND | (clob(LASTNAME) || ' ' || clob(FIRSTNAME) || ' ' || clob(DEPARTMENT) || ' ' || RESUME)) | FROM EMPLOYEE | WHERE DEPARTMENT = '5LGA'
|範例 8:
|最後,下列範例顯示如何使用任何有效的 SQL 表示式來衍生訊息內容。 |提供第二個表格 DEPT,其中含有 VARCHAR |直欄 DEPT_NO 與 DEPT_NAME,可傳送含有員工 LASTNAME 及 DEPT_NAME 的訊息:
|範例 8:
|SELECT DB2MQ.MQSEND(e.LASTNAME || ' ' || d.DEPTNAME) FROM EMPLOYEE e, DEPT d | WHERE e.DEPARTMENT = d.DEPTNAME
|MQSeries DB2 功能可接收或讀取訊息。 |讀取與接收之間的不同處,在於讀取傳回佇列之最早記載記錄的訊息,不需從佇列移除,而接收作業會使訊息從佇列移除。 |使用接收作業來擷取的訊息,僅可以擷取一次,而使用讀取作業來擷取的訊息,可多次擷取相同訊息。 |下列範例會對此作說明:
|範例 8:
|VALUES DB2MQ.MQREAD()
|此範例使用服務程式原則的預設品質,傳回 VARCHAR 字串,該字串包含預設服務程式定義的佇列之最早記載記錄的訊息。 |重要事項:請注意若沒有可供讀取的訊息,將傳回一個 NULL 值。 |此作業不會變更佇列。
|範例 9:
|VALUES DB2MQ.MQRECEIVE('Employee_Changes')
|上述範例顯示如何使用預設原則,將訊息從 Employee_Changes 服務程式定義的佇列之最早記載記錄移除。
|DB2 的一個非常有力的功能,是從使用者定義 (或 DB2 提供的) 功能,產生表格的能力。 您可以開發此表格功能,讓佇列內容可作為 DB2 表格。 |下列範例說明這個最簡易的形式:
|範例 10:
|SELECT t.* FROM table ( DB2MQ.MQREADALL()) t
|此查詢傳回一表格,由所有預設服務程式定義之佇列的所有訊息及有關這些訊息的描述資料所組成。 |當傳回的表格結構之完整定義是定義於附錄中,則第一直欄會反映訊息內容,其餘直欄則包含描述資料。 |若只要傳回訊息,可重新撰寫範例:
|範例 11:
|SELECT t.MSG FROM table (DB2MQ.MQREADALL()) t
|表格功能傳回的表格與資料庫直接擷取的表格相同。 |這表示您可以用廣泛的方法使用此表格。 |例如,您可以結合一表格與另一表格的內容,或計算佇列中的訊息數量:
|範例 12:
|SELECT t.MSG, e.LASTNAME | FROM table (DB2MQ.MQREADALL() ) t, EMPLOYEE e | WHERE t.MSG = e.LASTNAME
|範例 13:
|SELECT COUNT(*) FROM table (DB2MQ.MQREADALL()) t
|您可以透過表格功能來建立概略表,以隱藏表格來源是佇列的事實。 |例如,下列範例透過服務程式 NEW_EMPLOYEES 所參照的佇列,來建立名為 NEW_EMP 的概略表:
|範例 14:
|CREATE VIEW NEW_EMP (msg) AS | SELECT t.msg FROM table (DB2MQ.MQREADALL()) t
|在此案例中,概略表僅以包含整個訊息的單一直欄來定義。 |若訊息是簡式的架構,例如包含固定長度的兩個欄位, |則它會直接向前以使用 DB2 內建功能,將訊息剖析至兩直欄中。 |例如,若您知道傳送至特殊佇列的訊息都包含一個 18 位元的姓氏,其後則是一個 18 位元的名字,則您可以定義一個概略表,包含每一個個別直欄的欄位,例如:
|範例 15:
|CREATE VIEW NEW_EMP2 AS | SELECT left(t.msg,18) AS LNAME, right(t.msg,18) AS FNAME | FROM table(DB2MQ.MQREADALL()) t
|「DB2 儲存程序建置器」的新特性「MQSeries 輔助精靈」,可用來建立新的 DB2 表格功能及概略表,其將有定界符號的訊息結構對映至直欄。
|最後,通常要將一或多個訊息內容儲存在資料庫中。 |這可使用 SQL 的完整功能來完成,以操作並儲存訊息內容。 |最簡易的範例可能是:
|範例 16:
|INSERT INTO MESSAGES | SELECT t.msg FROM table (DB2MQ.MQRECEIVEALL()) t
|提供包含 VARCHAR(2000) 單一直欄的表格 MESSAGES,上述的陳述式會從預設服務程式佇列,將訊息插入表格中。 可修飾此技術,以涵蓋情況的廣泛種類。
|應用程式整合是許多解決方案的一般元素。 |不論將購買的應用程式整合到現存的基礎架構中,或只將新開發的應用程式整合到現存環境中,我們通常會面對集中子系統之不同集合的作業,以構成完整的工作。 |MQSeries 通常被視為整合應用程式的基本工具。 |可在大部份硬體、軟體及語言環境中存取,MQSeries 提供交互連接應用程式的不同集合之方法。
|此節將討論部份應用程式整合實務及如何以 DB2 來使用它們。 |因為主題相當廣泛,「應用程式整合」的廣泛討論超越了此工作的範圍。 |因此,重點僅在兩個簡單的主題:Request/Reply 通信,及 MQSeries Integrator 及 Publish/Subscribe。
|「Request/Reply (R/R)」通信方法是最普遍的技術,一個應用程式可向另一個應用程式要求服務。 |執行此動作的其中一種方法,是讓要求程式將訊息傳送至要求執行某些工作的服務提供程式。一旦工作已完成,供應程式可決定將結果 (或完成確認) 傳回要求器。 |但使用上述的基本傳訊技術,就不能連接傳送者要求與服務提供程式回應。 |除非要求程式在繼續執行之前,先等待回覆,否則某些機制必須用來結合每一個回覆及其要求。MQSeries 不強制程式開發者建立這類機制, |而是提供一個相關 ID,使交換處的訊息有相關性。
|當有許多方法可供此機制使用時,最簡易的方法是讓要求器用已知的相關 ID 來標示訊息,例如下列所示:
|範例 17:
|DB2MQ.MQSEND ('myRequester','myPolicy','SendStatus:cust1','Req1')
|此陳述式將最終參數 Req1 新增至上述的 MQSEND 陳述式中,以表示要求的相關 ID。
|若要接收此特定要求的回覆,請使用相對應的 MQRECEIVE 陳述式, |選擇性地接收符合此相關 ID 且由指示的服務程式所定義的第一則訊息,如下所示:
|範例 18:
|DB2MQ.MQRECEIVE('myReceiver','myPolicy','Req1')
|如果服務要求的應用程式忙線中,且要求器在回覆傳送之前發出上述的 MQRECEIVE, |則會找不到與此相關 ID 相符的訊息。
|若要接收服務程式要求及相關 ID,請使用與下列類似的陳述式:
|範例 19:
|SELECT msg, correlid FROM table (DB2MQ.MQRECEIVEALL('aServiceProvider','myPolicy',1)) t
|這會傳回服務程式 aServiceProvider 的第一個要求之訊息及相關 ID。
|一旦執行了服務程式,它會將回覆訊息傳送給 aReauester 說明的佇列。 |在這期間,服務要求程式仍會執行其他作業。 |事實上,並不保證起始服務程式要求會在設定時間內回應。 |如同這類的應用程式層次逾時,必須由發展程式來管理;要求程式必須輪詢偵測回覆的情況。
|這種時間獨立非同步處理的優點,是要求程式及服務供應程式是完全獨立地執行。 |這可用於適合的環境,應用程式僅會斷續地連接,也可用於更批次導向的環境,多重要求或回覆會在處理程序前先聚集起來。 這種集合體通常用於資料倉儲環境,以定期地更新資料倉儲或作業資料儲存。
|應用程式整合中的另一個一般實務範例,是一應用程式通知其他應用程式有關興趣的事件。 |您可容易地將訊息傳送到佇列,該佇列由另一個應用程式監督。 |訊息內容可以是使用者定義字串,或可以從資料庫直欄來撰寫。 |簡式訊息往往是需要使用 MQSEND 功能來傳送的訊息。 |當這類訊息需要同時傳送到多個接收者時,可以使用 MQSeries AMI 的「分送清單」機能。
|分送清單是使用 AMI 管理工具來定義。分送清單包含個別服務程式的清單。 |傳送到分送清單的訊息,會轉遞到此清單中所定義的每一個服務程式。 |當已知一些服務程式一直對每個訊息有興趣時,這是特別有用的功能。 |下列範例顯示傳送訊息至分送清單 interestedParties:
|範例 20:
|DB2MQ.MQSEND('interestedParties','information of general interest');
|當特殊服務程式應接收的訊息需要更多控制時,則需要 Publish/Subscribe 能力。 |Publish/Subscribe 系統通常提供一個可調整的、安全的環境,許多訂戶可在其中登記,以從多個公布者接收訊息。 |若要支援此能力,可使用 MQPublish 介面,與 MQSeries Integrator 或 MQ Series Publish/Subscribe 機能連接。
|MQPublish 可讓使用者選用性地指定與訊息相關的主題。 |主題可讓用戶更清楚地指定要接受的訊息。 |步驟順序如下: |
|若要使用所有預設值及 NULL 主題來公布此資料,您可使用下列陳述式:
|範例 21:
|SELECT DB2MQ.MQPUBLISH(LASTNAME || ' ' || FIRSTNAME || ' ' || DEPARTMENT|| ' ' ||cha |r(AGE)) | FROM EMPLOYEE | WHERE DEPARTMENT = '5LGA'
|完整的指定所有參數並簡化訊息,使其僅包含 LASTNAME,陳述式可能如下所示:
|範例 22:
|SELECT DB2MQ.MQPUBLISH('HR_INFO_PUB', 'SPECIAL_POLICY', LASTNAME, | 'ALL_EMP:5LGA', 'MANAGER') | FROM EMPLOYEE | WHERE DEPARTMENT = '5LGA'
|此陳述式使用 SPECIAL_POLICY 服務程式,將訊息公布至 HR_INFO_PUB 公佈服務程式中。 |訊息指出傳送者是 MANAGER 主題。 |主題字串說明可指定使用「:」連接的多重主題。 |在此範例中,使用這兩個主題可讓用戶登記 ALL_EMP 或只登記 5LGA,以接收這些訊息。
|若要接收公布的訊息,您必須先將您的喜好登記在訊息中, |訊息包含給定的主題並指出訊息應該傳送的用戶服務程式之名稱。 |重要事項:請注意 AMI 用戶服務程式有定義分配管理系統服務程式及接收者服務程式。 |分配管理系統服務程式是用戶與發布/訂閱分配管理系統通信的方式, |而接收者服務程式是符合訂閱要求將傳送的地方。 |7下列陳述式在主題 ALL_EMP 中登記喜好。
|範例 23:
|DB2MQ.MQSUBSCRIBE('aSubscriber', 'ALL_EMP')
|一旦訂閱了應用程式,以主題 ALL_EMP 公布的訊息,將轉遞到用戶服務程式所定義的接收者服務程式中。 |一個應用程式可以有多重的並行訂閱。若要取得符合您的訂閱的訊息,您可以使用任何標準的訊息擷取功能。例如,若用戶服務程式 aSubscriber 將接收者服務程式定義為 aSubscriberReceiver,而非下列陳述式,則將會非破壞性地讀取第一個訊息:
|範例 24:
|DB2MQ.MQREAD('aSubscriberReceiver')
|若要決定以下要公布的訊息與主題,您可以使用其中一種表格功能。 |下列陳述式會接收 aSubscriberReceiver 的前五個訊息,並顯示訊息與主題:
|範例 25:
|SELECT t.msg, t.topic FROM table (DB2MQ.MQRECEIVEALL('aSubscriberReceiver',5)) t
|若要以主題 ALL_EMP 來讀取所有訊息,您可以影響 SQL 的能力,請發出:
|範例 26:
|SELECT t.msg FROM table (DB2MQ.MQREADALL('aSubscriberReceiver')) t | WHERE t.topic = 'ALL_EMP'
|當您不再有興趣訂閱特殊主題時,您必須使用陳述式,明確地取消訂閱,例如:
|範例 27:
|DB2MQ.MQUNSUBSCRIBE('aSubscriber', 'ALL_EMP')
|一旦發出此陳述式,發佈/訂閱分配管理系統將不再傳送符合訂閱的訊息。
|資料庫傳訊的另一個重要技術是自動化公布。 |使用 DB2 中的觸發函式機能,您可以自動公布訊息,作為觸發函式呼叫的一部份。 |當其他的自動資料公布技術存在時,觸發程式基礎的方法可讓管理者或開發者自由地建構訊息內容,並彈性地定義觸發動作。請注意,任何觸發函式的使用,都必須給付執行頻率與成本的費用。 |下列範例說明觸發函式如何使用 MQSeries DB2 功能。
|下列範例顯示每次雇用新員工時,公布訊息是很容易的。 |任何訂閱 HR_INFO_PUB 服務程式並在 NEW_EMP 中登記喜好的使用者或應用程式,將會接收到一訊息,包括每一個新員工的日期、名稱及部門。
|範例 28:
|CREATE TRIGGER new_employee AFTER INSERT ON employee REFERENCING NEW AS n | FOR EACH ROW MODE DB2SQL | VALUES DB2MQ.MQPUBLISH('HR_INFO_PUB&', 'NEW_EMP', | current date || ' ' || LASTNAME || ' ' || DEPARTMENT)