動詞處理

連接器依據每一個商業物件的動詞來處理協同作業傳送給它的商業物件。連接器使用商業物件處理常式和 doForVerb() 方法來處理連接器支援的商業物件。連接器支援下列商業物件動詞:

註:
搭配 Create、Update 及 Delete 動詞的商業物件可同步或非同步地發出。 預設模式為非同步。 對於具有 Retrieve、Exists 或 Retrieve by Content 等動詞的商業物件,連接器不支援非同步遞送;因此,對於 Retrieve、Exists 或 Retrieve by Content 動詞, 預設模式為同步。

Create、update 及 delete

對於搭配 create、update 及 delete 動詞的商業物件, 其處理程序視物件是同步或非同步發出而定。

非同步遞送

這是具有 Create、Update 及 Delete 動詞之商業物件的預設遞送模式。訊息是透過資料處理常式從商業物件中建立,然後寫入輸出佇列中。 如果訊息順利遞送,則連接器傳回 BON_SUCCESS,否則傳回 BON_FAIL。

註:
連接器無從驗證訊息是否已被收到或是否已採取動作。

同步遞送

若連接器內容中已定義 replyToQueue,且 ResponseTimeout 存在於商業物件的轉換內容中,則連接器會以同步模式來發出要求。 然後,連接器將等待回應以驗證接收之應用程式已採取適當的動作。

對於 MQ Integrator Broker,連接器最初發出的訊息含有表 1 顯示的標頭。

表 1. 要求訊息描述子標頭 (MQMD)
欄位 說明
Format 格式名稱 轉換內容中所定義的輸出格式,並截斷成 8 個字元以符合 IBM 基本需求 (例如:MQSTR
MsgType 訊息類型 MQMT_DATAGRAM*
Report 所要求之報告訊息的選項。 當期望有回應訊息時,將此欄位輸入資料如下:MQRO_PAN* 表示如果處理順利完成,則需要正面動作報告。MQRO_NAN* 表示如果處理失敗,則需要負面動作報告。MQRO_COPY_MSG_ID_TO_CORREL_ID* 表示已產生之報告的相互關係 ID 應該等於最初所發出之要求的訊息 ID。
ReplyToQ 回覆佇列的名稱 當預期為回應訊息時,此欄位中會輸入連接器內容 ReplyToQueue 的值。
Persistence 訊息持續性 MQPER_PERSISTENT*
Expiry 訊息生命週期 MQEI_UNLIMITED*

* 表示 IBM 所定義的常數。

表 1 所說明的訊息標頭後面接著訊息主體。訊息主體為已透過資料處理常式來序列化的商業物件。

Report 欄位的設定指出預期從接收之應用程式傳回正面和負面的動作報告。發出訊息的執行緒將等待回應訊息, 此回應訊息指出接收之應用程式是否能夠處理要求。

當應用程式收到來自連接器的同步要求時,它會處理商業物件,並發出報告訊息, 如表 2表 3表 4 所說明。

表 2. 回應訊息描述子標頭 (MQMD)
欄位 說明
Format 格式名稱 轉換內容中所定義的 busObj 輸入格式。
MsgType 訊息類型 MQMT_REPORT*

* 表示 IBM 所定義的常數。

表 3. 回應訊息的個體群
動詞 回饋欄位 訊息主體
Create、update 或 delete

SUCCESS

VALCHANGE

(選用)反映變更的序列化商業物件。

VALDUPES

FAIL

(選用)錯誤訊息。


表 4. MQ Integrator Broker 回饋碼及 WebSphere Business Integration 系統回應值
MQ Integrator 回饋碼 相等的 WebSphere Business Integration 系統回應*
MQFB_PANor MQFB_APPL_FIRST SUCCESS
MQFB_NANMQFB_APPL_FIRST + 1 FAIL
MQFB_APPL_FIRST + 2

VALCHANGE

MQFB_APPL_FIRST + 3

VALDUPES

MQFB_APPL_FIRST + 4

MULTIPLE_HITS

MQFB_APPL_FIRST + 5

FAIL_RETRIEVE_BY_CONTENT

MQFB_APPL_FIRST + 6

BO_DOES_NOT_EXIST

MQFB_APPL_FIRST + 7 UNABLE_TO_LOGIN (導致立即終止連接器代理程式)
MQFB_APPL_FIRST + 8 APP_RESPONSE_TIMEOUT

*詳細資料請參閱 Connector Development Guide

若可處理商業物件,則應用程式會建立報告訊息, 並將回饋欄位設為 MQFB_PAN (或特定的 WebSphere Business Integration 系統值)。 (可選用的)應用程式將於訊息主體中輸入含有任何變更的序列化商業物件。 若無法處理商業物件,應用程式則會建立報告訊息, 並將回饋欄位設為 MQFB_NAN (或特定的 WebSphere Business Integration 系統值), 然後在訊息主體中選擇性地併入錯誤訊息。 於任何一種情況下,應用程式會將訊息的 correlationID 欄位設為連接器訊息的 messageID,並發出至 replyTo 欄位所指定的佇列。

在擷取回應訊息時,依預設連接器會比對回應的 correlationID 與要求訊息的 messageID。 然後,連接器會通知發出要求的執行緒。依據回應的回饋欄位,連接器會預期訊息主體中包含商業物件或錯誤訊息。若原預期為商業物件,但訊息主體中並未輸入資料,則連接器只是傳回 InterChange Server 最初發出的相同商業物件來滿足「要求」作業。若原預期為錯誤訊息,但訊息主體中並未輸入資料, 則一般錯誤訊息伴隨著回應碼會傳回至 InterChange Server。 然而,您還可以使用訊息選取元,以識別、過濾或控制配接器如何為給定的要求識別回應訊息。此訊息選取元功能是一個 JMS 特性。它僅應用於同步的要求處理,說明如下。

使用訊息選取元過濾回應訊息

在收到要進行同步要求處理的商業物件時,連接器會檢查動詞之應用程式特有資訊中的 response_selector 字串是否存在。如果未定義 response_selector, 連接器會使用上面介紹的相互關係 ID 來識別回應訊息。

如果定義了 response_selector,則連接器會預期具有下列語法的名稱-值配對:

response_selector=JMSCorrelationID LIKE'selectorstring'

訊息 selectorstring 必須唯一地識別回應,並且其值必須像下面範例顯示的一樣用單引號括上:

response_selector=JMSCorrelationID LIKE 'Oshkosh'

在上面的範例中,發出要求訊息之後,配接器會監視 ReplyToQueue 中是否有 correlationID 等於 "Oshkosh" 的回應訊息。配接器會擷取符合此訊息選取元的第一則訊息,然後將其當作回應來分派。

配接器會選擇性地執行可讓您為每個要求產生唯一訊息選取元的執行時期替代。不指定訊息選取元,您可以大括弧括起的整數形式, 指定位置保留區,例如:'{1}'。然後接上一個冒號及以逗點區隔的屬性清單,以便用於替代。位置保留區中的整數將作為屬性的索引,以便用於替代。例如,下列的訊息選取元:

response_selector=JMSCorrelationID LIKE '{1}': MyDynamicMO.CorrelationID

會通知配接器用選取元之後的第一個屬性值 (在本例中為 MyDynamicMO 子項物件的 CorrelationId 屬性) 取代 {1}。如果屬性 CorrelationID 的值為 123ABC,配接器會產生並使用依下列準則建立的訊息選取元:

JMSCorrelation LIKE '123ABC'

來識別回應訊息。

您還可以指定多重替代,如下所示:

response_selector=PrimaryId LIKE '{1}' AND AddressId LIKE '{2}' : PrimaryId, Address[4].AddressId

在此範例中,配接器會用最上層商業物件之屬性 PrimaryId 替代 {1}, 以子項儲存區物件 Address 第五個位置的 AddressId 值替代 {2}。以這種方式,您可以在回應訊息選取元中參照商業物件及 meta 物件中的任何屬性。如需如何使用 Address[4].AddressId 執行深層擷取的詳細資訊,請參閱 JCDK API 手冊 (getAttribute 方法)。

當執行時期發生下列任一情況時,都會報告錯誤:

例如,如果您在訊息選取元中併入文字值 '{' 或 '}',則可以分別使用 '{{' 或 "{}"。您還可以將這些字元放置在屬性值中, 在這種情況下就不需要第一個 "{"。請考量以下使用跳離字元的範例:response_selector=JMSCorrelation LIKE '{1}' and CompanyName='A{{P': MyDynamicMO.CorrelationID

連接器會解析此訊息選取元,如下所示:

JMSCorrelationID LIKE '123ABC' and CompanyName='A{P'

當連接器遇到屬性值中的特殊字元 (如 '{'、'}'、':' 或 ';') 時,會將它們直接插入查詢字串。這可讓您在查詢字串中併入特殊字元, 這些字元同時也作為應用程式特有資訊的定界字元。

下一個範例說明如何從屬性值擷取文字字串替代:

response_selector=JMSCorrelation LIKE '{1}' and CompanyName='A{{P': MyDynamicMO.CorrelationID

MyDynamicMO.CorrelationID 內含值 {A:B}C;D,連接器會解析下面的訊息選取元: JMSCorrelationID LIKE '{A:B}C;D' and CompanyName='A{P'

如需回應選取元代碼的詳細資訊,請參閱 JMS 1.0.1 規格。

Retrieve、exists 及 retrieve by content

具有 Retrieve、Exists 及 Retrieve By Content 動詞的商業物件僅支援同步遞送。連接器處理這些動詞的商業物件,就如同處理 create、update 及 delete 定義的同步遞送一樣。 然而,使用 Retrieve、Exists 及 Retrieve By Content 動詞時,responseTimeoutreplyToQueue 是必要的。 再者,對於 Retrieve By Content 和 Retrieve 動詞,訊息主體中必須輸入序列化的商業物件才能完成交易。

表 5 顯示這些動詞的回應訊息。

表 5. 回應訊息的個體群
動詞 回饋欄位 訊息主體
Retrieve 或 RetrieveByContent

FAIL FAIL_RETRIEVE_BY_CONTENT

(選用)錯誤訊息。

MULTIPLE_HITS SUCCESS

已序列化的商業物件。
Exist

FAIL

(選用)錯誤訊息。

SUCCESS


Copyright IBM Corp. 1997, 2003