Meta 物件屬性配置

MQ Integrator Broker 的連接器可辨識和讀取兩種 Meta 物件:

動態子項 Meta 物件的屬性值會重複並置換靜態 meta 物件的屬性值。

靜態 Meta 物件

MQ Integrator Broker 配置 Meta 物件包含了針對不同商業物件所定義的轉換內容清單。若要定義商業物件的轉換內容,請先使用語法 busObj_verb 來建立字串屬性並且命名。 例如,若要針對具有動詞 Create 的 Customer 物件定義轉換內容, 請建立名為 Customer_Create 的屬性。 在屬性的應用程式特有資訊中,您再指定實際的轉換內容。

註:
若未指定靜態 meta 物件,則於輪詢期間,連接器無法將特定的 訊息格式對映至特定的商業物件類型。 此情況下,連接器會將訊息文字傳送至已配置的資料處理常式, 但不指定商業物件。 若資料處理常式無法僅依據文字來建立商業物件,連接器會報告錯誤,指出無法辨識這個訊息格式。

表 10 說明 meta 物件內容。

表 10. MQ Integrator Broker Meta 物件內容
內容名稱 說明
InputFormat InputFormat 為給定之商業物件相關的訊息格式。 如果可能,擷取的訊息使用這種格式時,會轉換成給定的商業物件。 如果未對商業物件指定此格式,則連接器不會為給定的商業物件處理訂閱遞送。 請勿使用預設轉換內容來設定此內容;其值用於將送入的訊息與商業物件比對。
InputQueue 連接器輪詢來偵測新訊息的輸入佇列。
註:
連接器特有內容中的 InputQueue 內容會定義配接器輪詢哪些佇列。這是配接器用來決定要輪詢哪些佇列的唯一內容。在靜態 MO 中,InputQueue 內容及 InputFormat 內容可作為配接器的準則,以將給定的訊息與特定的商業物件對映。如需將資料處理常式與 InputQueues 對映的資訊,請參閱將資料處理常式對映到 InputQueues
OutputFormat OutputFormat 設定於所給定之商業物件所建立的訊息上。 如果未指定 OutputFormat,則採用輸入格式(如果可用)。
OutputQueue 從給定的商業物件送出的訊息會傳遞至這個 OutputQueue 輸出佇列。
ResponseTimeout 表示等待回應時,逾時之前的時間長度(毫秒)。 若保留成未定義或指定的值小於零,則連接器不等待回應就立即傳回 SUCCESS。
TimeoutFatal 如果定義這個內容且值為 True,則當 ResponseTimeout 指定的時間內未收到回應時,連接器會傳回 APP_RESPONSE_TIMEOUT。 所有其他正在等待回應訊息的執行緒,會立即將 APP_RESPONSE_TIMEOUT 傳回到 InterChange Server。 這會導致 InterChange Server 終止連接器。

此外,於 Meta 物件中可定義一個名為 Default 的保留內容。當此內容出現時,其應用程式特有資訊會指定所有商業物件轉換內容的預設值。


表 11. Customer_Create 的 MQ Integrator Broker 靜態 Meta 物件結構
內容名稱 應用程式特有文字
預設值 OutputFormat=CUST_OUT; OutputQueue=QueueA; ResponseTimeout=10000; TimeoutFatal=False

應用程式特有資訊

應用程式特有資訊的結構是名稱-值配對的格式,且以分號來區隔。例如:

InputFormat=CUST_IN;OutputFormat=CUST_OUT

將資料處理常式對映到 InputQueues

您可以使用靜態 Meta 物件的特定應用程式資訊中的 InputQueue 內容,來建立資料處理常式與輸入佇列的關聯性。當處理具有不同格式和轉換需求的多個交易友機時,此功能很有幫助。 若要這麼做,您必須:

  1. 使用連接器特有內容 (請參閱InputQueue) 來配置一或多個輸入佇列。
  2. 針對每一個輸入佇列,在特定應用程式資訊中指定佇列管理程式和輸入佇列名稱,以及資料處理常式類別名稱和 MIME 類型。

例如,靜態 Meta 物件中的下列屬性可建立資料處理常式與 InputQueue (名稱為 CompReceipts) 的關聯性:

[Attribute]
 Name = Cust_Create
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = InputQueue=//queue.manager/CompReceipts;DataHandlerClassName=
 com.crossworlds.DataHandlers.MQ.disposition_notification;DataHandlerMimeType=
 message/
 disposition_notification
 IsRequiredServerBound = false
 [End]
 

超載輸入格式

於擷取訊息時,連接器通常會比對輸入格式與一個特定商業物件和動詞組合。 然後,連接器會將商業物件名稱和訊息內容傳送至資料處理常式。此可讓資料處理常式驗證訊息內容是否對應於使用者預期的商業物件。

然而,若為多個商業物件定義相同輸入格式, 則連接器將資料傳送到資料處理常式之前,無法判斷資料所代表的商業物件。 在此情況下,連接器僅將訊息內容傳送到資料處理常式,然後依據已產生的商業物件來查閱轉換內容。因此,資料處理常式必須僅依據訊息內容來判斷商業物件。

若未設定已產生之商業物件的動詞,則連接器會使用任何動詞來 搜尋針對這個商業物件所定義的轉換內容。 如果只找到一組轉換內容,連接器會指派指定的動詞。 如果找到多個內容,連接器會讓訊息失敗,因為無法區別動詞。

範例 Meta 物件

以下顯示的 Meta 物件將連接器配置成使用動詞 Create,Update、Delete 及 Retrieve 來轉換 Customer 商業物件 (請注意,其屬性 Default 在 Meta 物件中已定義)。相應地,連接器使用此屬性 (OutputQueue=CustomerQueue1;ResponseTimeout=5000;TimeoutFatal=true) 的轉換內容。因此,除非屬性另有指定,否則連接器會將所有的商業物件發出到佇列 CustomerQueue1,然後等待回應訊息。如果回應不在 5000 毫秒內到達,連接器則會立即終止。

具有動詞 Create 的 Customer 物件

屬性 Customer_Create 指示連接器,應該將格式 NEW 的任何訊息轉換為具有動詞 Create 的 Customer 商業物件。由於未定義輸出格式,連接器會使用為輸入定義的格式 (在本例中為 NEW), 傳送代表此物件動詞組合的訊息。

具有動詞 Update 及 Delete 的 Customer 物件

輸入格式 MODIFY 已超載 -- 為具有動詞 Update 的商業物件 Customer 及動詞 Delete 的商業物件 Customer 定義。為了順利地處理此格式的擷取訊息,商業物件名稱及動詞 (可能) 應該包含在訊息內容中,以讓資料處理常式識別 (請參閱超載輸入格式)。對於「要求」處理程序作業, 連接器會使用輸入格式 MODIFY 為每個動詞傳送訊息,因為沒有定義輸出格式。

具有動詞 Retrieve 的 Customer 物件

屬性 Customer_Retrieve 指定具有動詞 Retrieve 且類型為 Customer 的商業物件,應該以格式 Retrieve 作為訊息傳送。請注意已置換預設回應時間,因此連接器在逾時之前最多會等待 10000 毫秒 (如果未接收到回應,它仍然會終止)。

[ReposCopy]
 Version = 3.1.0
 Repositories = 1cHyILNuPTc=
 [End]
 [BusinessObjectDefinition]
 Name = Sample_MO
 Version = 1.0.0
  
 [Attribute]
 Name = Default
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = true
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = OutputQueue=CustomerQueue1;ResponseTimeout=5000;TimeoutFatal=true
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = Customer_Create
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = InputFormat=NEW
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = Customer_Update
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = InputFormat=MODIFY
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = Customer_Delete
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = InputFormat=MODIFY
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = Customer_Retrieve
 Type = String
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 AppSpecificInfo = OutputFormat=RETRIEVE;ResponseTimeout=10000
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = ObjectEventId
 Type = String
 MaxLength = 255
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
  
 [Verb]
 Name = Create
 [End]
  
 [Verb]
 Name = Delete
 [End]
  
 [Verb]
 Name = Retrieve
 [End]
  
 [Verb]
 Name = Update
 [End]
 [End]
 

動態子項 Meta 物件

如果難以透過靜態 Meta 物件來指定必要的 Meta 資料,或是這樣做並不可行,則連接器可選擇性地接受執行時期為每一個商業物件實例所指定的 Meta 資料。

連接器將辨識並讀取動態 Meta 物件的轉換內容, 這個物件被新增為傳送至連接器之最上層商業物件的子項。 動態子項 Meta 物件的屬性值會重複轉換內容, 您可透過用來配置連接器的靜態 meta 物件指定這些轉換內容。

因為動態子項 Meta 物件內容會置換靜態 meta 物件中找到的內容, 所以若您指定動態子項 Meta 物件,則不必併入用來指定靜態 meta 物件的連接器內容。 因此,您可自由地使用動態子項 Meta 物件, 不需考慮靜態 meta 物件,反之亦然。

註:
連接器不支援動態子項 Meta 物件的使用,以在同步事件遞送期間供應協同作業名稱。

表 11表 12 分別顯示商業物件 Customer_Create 的靜態和動態子項 Meta 物件範例。 請注意,應用程式特有資訊包含分號定界的名稱-值配對。

表 12. Customer_Create 的 MQ Integrator Broker 動態子項 Meta 物件結構
內容名稱
OutputFormat CUST_OUT
OutputQueue QueueA
ResponseTimeout 10000
TimeoutFatal False

連接器將檢查已接收之最上層商業物件的應用程式特有資訊,以判斷標籤 cw_mo_conn 是否指定子項 Meta 物件。若已指定,動態子項 Meta 物件值會置換靜態 meta 物件中指定的值。

輪詢期間動態子項 Meta 物件的移入

為了向協同作業提供更多輪詢期間所擷取的訊息資訊, 連接器會移入動態 meta 物件的特定屬性(如果已經針對已建立的商業物件定義的話)。

表 13 顯示如何建構動態子項 meta 物件以執行輪詢。

表 13. 針對輪詢的 MQ Integrator Broker 動態子項 Meta 物件結構
內容名稱 範例值
InputFormat CUST_IN
InputQueue MYInputQueue
OutputFormat CxIgnore
OutputQueue CxIgnore
ResponseTimeout CxIgnore
TimeoutFatal CxIgnore

表 13 所示, 您可於動態子項 Meta 物件中定義 Input_FormatInputQueue 這兩個額外的屬性。Input_Format 會輸入擷取的訊息格式,而 InputQueue 屬性則包含已從中擷取指定訊息的佇列名稱。 如果子項 Meta 物件中未定義這些內容,則不會輸入資料。

範例實務:

範例動態子項 Meta 物件

[BusinessObjectDefinition]
 Name = MO_Sample_Config
 Version = 1.0.0
  
 [Attribute]
 Name = OutputFormat
 Type = String
 MaxLength = 1
 IsKey = true
 IsForeignKey = false
 IsRequired = false
 DefaultValue = CUST
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = OutputQueue
 Type = String
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 DefaultValue = OUT
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = ResponseTimeout
 Type = String
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 DefaultValue = -1
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = TimeoutFatal
 Type = String
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 DefaultValue = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = InputFormat
 Type = String
 MaxLength = 1
 IsKey = true
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = InputQueue
 Type = String
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = ObjectEventId
 Type = String
 MaxLength = 255
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
  
 [Verb]
 Name = Create
 [End]
  
 [Verb]
 Name = Delete
 [End]
  
 [Verb]
 Name = Retrieve
 [End]
  
 [Verb]
 Name = Update
 [End]
 [End]
 [BusinessObjectDefinition]
 Name = Customer
 Version = 1.0.0
 AppSpecificInfo = cw_mo_conn=MyConfig
  
 [Attribute]
 Name = FirstName
 Type = String
 MaxLength = 1
 IsKey = true
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = LastName
 Type = String
 MaxLength = 1
 IsKey = true
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = Telephone
 Type = String
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = MyConfig
 Type = MO_Sample_Config
 ContainedObjectVersion = 1.0.0
 Relationship = Containment
 Cardinality = 1
 MaxLength = 1
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
 [Attribute]
 Name = ObjectEventId
 Type = String
 MaxLength = 255
 IsKey = false
 IsForeignKey = false
 IsRequired = false
 IsRequiredServerBound = false
 [End]
  
 [Verb]
 Name = Create
 [End]
  
 [Verb]
 Name = Delete
 [End]
  
 [Verb]
 Name = Retrieve
 [End]
  
 [Verb]
 Name = Update
 [End]
 [End]
 

JMS 標頭、MQ Integrator Broker 訊息內容及動態子項 Meta 物件屬性

您可將屬性新增到動態 Meta 物件,以取得訊息傳輸的詳細資訊及更多控制。新增此類屬性可讓您修改 JMS 內容、 控制每個要求的 ReplyToQueue (而不是使用指定在配接器內容中的預設 ReplyToQueue),及重設訊息 CorrelationID 為目標。本節說明以下屬性,以及它們如何影響同步及非同步模式的事件通知及要求處理。

在動態 Meta 物件中可以辨識反映 JMS 及 MQ Integrator Broker 標頭內容的下列屬性。

表 14. 動態 Meta 物件標頭屬性
標頭屬性名稱 模式 對應的 JMS 標頭
CorrelationID
 
讀取/寫入 JMSCorrelationID
ReplyToQueue
 
讀取/寫入 JMSReplyTo
DeliveryMode
 
讀取/寫入 JMSDeliveryMode
Priority
 
讀取/寫入 JMSPriority
Destination
 
讀取 JMSDestination
Expiration
 
讀取 JMSExpiration
MessageID
 
讀取 JMSMessageID
Redelivered
 
讀取 JMSRedelivered
TimeStamp
 
讀取 JMSTimeStamp
Type
 
讀取 JMSType
UserID
 
讀取 JMSXUserID
AppID
 
讀取 JMSXAppID
DeliveryCount
 
讀取 JMSXDeliveryCount
GroupID
 
讀取 JMSXGroupID
GroupSeq
 
讀取 JMSXGroupSeq
JMSProperties
 
讀取/寫入

唯讀屬性在事件通知期間,從訊息標頭中讀取並寫入動態 Meta 物件。當在要求處理程序期間發出回應訊息時,這些內容也會移入動態 Meta 物件。讀取/寫入屬性會在要求處理程序期間,於建立的訊息標頭上設定。在事件通知期間, 讀取/寫入屬性從訊息標頭中讀取,以移入動態 Meta 物件。

這些屬性的解譯及使用會在下節中說明。

註:
上面的任何屬性都不是必要的。您可能會將任何屬性新增到與商業程序相關的動態 Meta 物件。

同步事件通知

對於同步的事件處理程序,配接器會在將回應訊息傳回應用程式之前公佈事件,並等待整合分配管理系統回應。 在傳回的回應訊息中會反映商業資料的任何變更。在公佈事件之前,配接器會按照非同步事件通知的說明,將資料移入動態 Meta 物件。會在發出回應的標頭中反映動態 Meta 物件中設定的值,如下所述 (會忽略動態 Meta 物件中所有其他唯讀標頭屬性):

非同步要求處理程序

連接器會使用動態 Meta 物件 (若有的話) 在發出要求訊息之前將資料先移入要求訊息。連接器會在傳送要求訊息之前,執行下列步驟:

  1. 如果屬性 CorrelationID 存在於動態 Meta 物件中,則連接器會將離埠要求訊息的 CorrelationID 設為此值。
  2. 如果屬性 ReplyToQueue 在動態 Meta 物件指定,則連接器會透過要求訊息傳遞此值,並在此佇列上等待回應。 這可讓您置換在連接器配置內容中指定的 ReplyToQueue 值。如果您又指定了負的 ResponseTimeout (意味著連接器不應等待回應),則即使連接器實際上不等待回應,仍會設定回應訊息中的 ReplyToQueue
  3. 如果屬性 DeliveryMode 設為 2,則會持續傳送訊息。如果 DeliveryMode 設為 1,則不會持續傳送訊息。任何其他值可能會讓連接器失敗。如果未在 MO 中指定 DeliveryMode,則 JMS 提供程式會建立持續性設定。
  4. 如果指定了屬性 Priority,則連接器會設定送出要求中的值。Priority 屬性可以接受從 0 到 9 之間的值;任何其他值都可能會導致連接器終止。
  5. 如果在動態 Meta 物件中指定 JMSProperties 屬性,則會在連接器傳送之離埠訊息中,設定子項動態 Meta 物件中指定的對應 JMS 內容。

註:
如果動態 Meta 物件中的標頭屬性未定義,或指定 CxIgnore,則連接器會遵循其預設值。

同步要求處理程序

連接器會使用動態 Meta 物件 (若有的話) 在發出要求訊息之前將資料先移入要求訊息。如果動態 Meta 物件包含標頭屬性, 則連接器會將回應訊息中找到的對應新值移入其中。連接器會在收到回應訊息之後,執行下列步驟 (還有將與傳輸相關之資料移入 Meta 物件):

  1. 如果屬性 CorrelationID 存在於動態 Meta 物件中,則配接器會以指定在回應訊息中的 JMSCorrelationID 來更新此屬性。
  2. 如果屬性 ReplyToQueue 定義在動態 Meta 物件中,則配接器會以指定在回應訊息中的 JMSReplyTo 名稱來更新此屬性。
  3. 如果屬性 DeliveryMode 存在於動態 Meta 物件中,則配接器會以訊息的 JMSDeliveryMode 標頭欄位值來更新此屬性。
  4. 如果屬性 Priority 存在於動態 Meta 物件中,則配接器會以訊息的 JMSPriority 標頭欄位值來更新此屬性。
  5. 如果屬性 Destination 定義在動態 Meta 物件中,則配接器會以指定在回應訊息中的 JMSDestination 名稱來更新此屬性。
  6. 如果屬性 Expiration 存在於動態 Meta 物件中,則配接器會以訊息的 JMSExpiration 標頭欄位值來更新此屬性。
  7. 如果屬性 MessageID 存在於動態 Meta 物件中,則配接器會以訊息的 JMSMessageID 標頭欄位值來更新此屬性。
  8. 如果屬性 Redelivered 存在於動態 Meta 物件中,則配接器會以訊息 JMSRedelivered 標頭欄位值來更新此屬性。
  9. 如果屬性 TimeStamp 存在於動態 Meta 物件中,則配接器會以訊息的 JMSTimeStamp 標頭欄位值來更新此屬性。
  10. 如果屬性 Type 存在於動態 Meta 物件中,則配接器會以訊息的 JMSType 標頭欄位值來更新此屬性。
  11. 如果屬性 UserID 存在於動態 Meta 物件中,則配接器會以訊息的 JMSXUserID 標頭欄位值來更新此屬性。
  12. 如果屬性 AppID 存在於動態 Meta 物件中,則配接器會以訊息的 JMSXAppID 內容欄位值來更新此屬性。
  13. 如果屬性 DeliveryCount 存在於動態 Meta 物件中,則配接器會以訊息的 JMSXDeliveryCount 標頭欄位值來更新此屬性。
  14. 如果屬性 GroupID 存在於動態 Meta 物件中,則配接器會以訊息的 JMSXGroupID 標頭欄位值來更新此屬性。
  15. 如果屬性 GroupSeq 存在於動態 Meta 物件中,則配接器會以訊息的 JMSXGroupSeq 標頭欄位值來更新此屬性。
  16. 如果屬性 JMSProperties 定義在動態 Meta 物件中,則配接器會以回應訊息中找到的值,來更新定義在子項物件中的任何內容。如果定義在子項物件中的內容不存在於訊息中,則會將值設為 CxBlank。

註:
使用動態 Meta 物件變更設定在要求訊息中的 CorrelationID, 並不會影響配接器識別回應訊息的方法-配接器依預設會預期任何回應訊息的 CorrelationID 等於配接器傳送之要求的訊息 ID。

錯誤處理

如果 JMS 內容無法從訊息中讀取,或無法寫入訊息,則連接器會記載錯誤,且要求或事件會失敗。如果使用者定義的 ReplyToQueue 不存在或無法存取它,則連接器會記載錯誤,且要求會失敗。如果 CorrelationID 無效或無法設定,則連接器會記載錯誤,且要求會失敗。在所有情況下,記載的訊息都來自連接器訊息檔。

Copyright IBM Corp. 1997, 2003