WebSphere MQ 的連接器可辨識和讀取兩種 Meta 物件:
動態子項 Meta 物件的屬性值會重複並置換靜態 Meta 物件的屬性值。
WebSphere MQ 靜態 Meta 物件包含為不同商業物件所定義的轉換內容清單。若要定義商業物件的轉換內容,請先使用語法 busObj_verb 來建立字串屬性並且命名。 例如,若要使用動詞 Create 來定義 Customer 物件的轉換內容, 請建立命名為 Customer_Create 的屬性。 於屬性的特定應用程式文字中,您再指定實際的轉換內容。
下表說明 Meta 物件的內容。
內容名稱 | 說明 |
---|---|
CorrelationID | 此內容僅會影響要求處理程序期間的配接器行為,且其處理方式與動態 Meta 物件中的 CorrelationID 內容一樣。如需詳細資訊,請參閱非同步要求處理程序。 |
CollaborationName | CollaborationName
必須指定在商業物件/動詞組合之屬性的應用程式特有文字中。比方說,
如果使用者預期以動詞 Create 處理商業物件 Customer 的同步要求,則靜態 Meta
資料物件必須包含名為 Customer_Create 的屬性。
Customer_Create 屬性必須包含包括名稱-值配對的應用程式特有文字。例如,CollaborationName=MyCustomerProcessingCollab。請參閱應用程式特有資訊一節,以取得語法的詳細資料。 若不如此做將會導致連接器在試圖同步處理與 Customer 商業物件相關的要求時,發生執行時期錯誤。
|
DataEncoding |
DataEncoding 是用來讀寫訊息的編碼。 若於靜態 Meta
物件中未指定這個內容,連接器會嘗試不使用任何特定編碼來讀取訊息。 動態子項 Meta
物件中定義的 DataEncoding 將置換靜態 Meta 物件中定義的值。 預設值是
Text。 此屬性的值格式為
messageType[:enc]。亦即,Text:ISO8859_1、Text:UnicodeLittle、Text
或 Binary。 此內容與 DataEncoding 內容內部相關:每一 InputFormat
指定一個且僅一個 DataEncoding。
|
DataHandlerConfigMO | 傳送至資料處理常式以提供配置資訊的 Meta 物件。 若指定於靜態 Meta 物件中,則會置換 DataHandlerConfigMO 連接器內容中所指定的值。 當需要不同資料處理常式來處理不同的商業物件類型時,請使用此靜態 Meta 物件內容。若於動態子項 Meta 物件中定義這個內容, 則會置換連接器內容和靜態 Meta 物件內容。 當資料格式可能取決於實際商業資料時,請使用動態子項 Meta 物件來處理要求。指定的商業物件必須是連接器支援的物件。 |
DataHandlerMimeType | 可讓您依據特定 MIME 類型以要求資料處理常式。 如果在靜態 Meta 物件中指定,則會置換 DataHandlerMimeType 連接器內容中所指定的值。當需要不同資料處理常式來處理不同的商業物件類型時,請使用此靜態 Meta 物件內容。若於動態子項 Meta 物件中定義這個內容, 則會置換連接器內容和靜態 Meta 物件內容。 當資料格式可能取決於實際商業資料時,請使用動態子項 Meta 物件來處理要求。DataHandlerConfigMO 中指定的商業物件應有一個屬性對映至這個內容的值。 |
DoNotReportBusObj | 使用者可以選擇併入 DoNotReportBusObj 內容。 若將這個內容設為
true,則所有發出的 PAN 報告訊息有空白的訊息主體。
當要求者想要確認要求已順利處理,但不需要商業物件的變更通知時,建議採用這項設定。
這不影響 NAN 報告。
如果在靜態 Meta 物件中找不到此內容,則連接器將其預設為 false,並在訊息報告中輸入商業物件。
|
InputFormat |
InputFormat 為給定之商業物件相關的訊息格式。
如果可能,擷取的訊息使用這種格式時,會轉換成給定的商業物件。 此內容與
InputFormat 內容內部相關:每一 InputFormat 指定一個且僅一個
DataEncoding。請勿使用預設轉換內容來設定此內容;其值用於將送入的訊息與商業物件比對。
|
OutputFormat | OutputFormat 設定於所給定之商業物件所建立的訊息上。 如果未指定 OutputFormat,則採用輸入格式(如果可用)。 動態子項 Meta 物件中定義的 OutputFormat 會置換靜態 Meta 物件中定義的值。 |
InputQueue | 連接器輪詢來偵測新訊息的輸入佇列。
|
OutputQueue | 從給定的商業物件送出的訊息會傳遞至這個 OutputQueue 輸出佇列。 動態子項 Meta 物件中定義的 OutputQueue 會置換靜態 Meta 物件中定義的值。 |
ResponseTimeout | 表示等待回應時,逾時之前的時間長度(毫秒)。 若保留成未定義或指定的值小於零,則連接器不等待回應就立即傳回 SUCCESS。動態子項 Meta 物件中定義的 ResponseTimeout 會置換靜態 Meta 物件中定義的值。 |
TimeoutFatal | 如果定義這個內容且值為 True,則當 ResponseTimeout 指定的時間內未收到回應時,連接器會傳回 APP_RESPONSE_TIMEOUT。 所有其他正在等待回應訊息的執行緒,會立即將 APP_RESPONSE_TIMEOUT 傳回到 InterChange Server。 這會導致 InterChange Server 終止連接器。動態子項 Meta 物件中定義的 TimeoutFatal 會置換靜態 Meta 物件中定義的值。 |
此外,於 Meta 物件中可定義一個名為 Default 的保留內容。當此內容出現時,其應用程式特有資訊會指定所有商業物件轉換內容的預設值。
請考量下列 Meta 物件範例。
內容名稱 | 特定應用程式文字 |
---|---|
預設值 | DataEncoding=Text:UnicodeLittle;
OutputFormat=CUST_OUT; OutputQueue=QueueA;ResponseTimeout=10000; TimeoutFatal=False |
應用程式特有資訊的結構是名稱-值配對的格式,且以分號來區隔。例如:
InputFormat=CUST_IN;OutputFormat=CUST_OUT
您可以使用靜態 Meta 物件的特定應用程式資訊中的 InputQueue 內容,來建立資料處理常式與輸入佇列的關聯性。當處理具有不同格式和轉換需求的多個交易友機時,此功能很有幫助。 若要這麼做,您必須:
例如,靜態 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 物件將連接器配置成使用動詞 Create、Update、Delete 及 Retrieve 來轉換 Customer 商業物件。請注意屬性 Default 定義在 Meta 物件中。連接器使用此屬性的轉換內容:
OutputQueue=CustomerQueue1;ResponseTimeout=5000;TimeoutFatal=true
作為所有其他轉換內容的預設值。因此,除非另外由屬性指定或由動態子項 Meta 物件值置換, 否則連接器會將所有的商業物件發出到佇列 CustomerQueue1,然後等待回應訊息。如果回應不在 5000 毫秒內到達,連接器則會立即終止。
屬性 Customer_Create 指示連接器,應該將格式 NEW 的任何訊息轉換為具有動詞 Create 的 Customer 商業物件。由於未定義輸出格式,連接器會使用為輸入定義的格式 (在本例中為 NEW), 傳送代表此物件動詞組合的訊息。
輸入格式 MODIFY 已超載 -- 為具有動詞 Update 的商業物件 Customer 及動詞 Delete 的商業物件 Customer 定義。為了順利地處理此格式的擷取訊息,商業物件名稱及動詞 (可能) 應該包含在訊息內容中,以讓資料處理常式識別 (請參閱超載輸入格式)。對於「要求」處理程序作業,因為沒有定義輸出格式, 連接器會使用輸入格式 MODIFY 為每個動詞傳送訊息。
屬性 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 物件,反之亦然。
前一節中的表格及下面的表格,分別顯示商業物件 Customer_Create
的範例靜態和動態子項 Meta
物件。請注意,應用程式特有資訊包含分號定界的名稱-值配對。
內容名稱 | 值 |
---|---|
DataEncoding | Text:UnicodeLittle |
DataHandlerMimeType* | text/delimited |
OutputFormat | CUST_OUT |
OutputQueue | QueueA |
ResponseTimeout | 10000 |
TimeoutFatal | False |
*假設在連接器配置內容或靜態 Meta 物件中指定了 DataHandlerConfigMO。
連接器將檢查已接收之最上層商業物件的應用程式特有資訊,以判斷標籤 cw_mo_conn 是否指定子項 Meta 物件。若已指定,動態子項 Meta 物件值會置換靜態 Meta 物件中指定的值。
為了向協同作業提供更多輪詢期間所擷取的訊息資訊, 連接器會移入動態 Meta 物件的特定屬性(如果已經針對已建立的商業物件定義的話)。
下表顯示如何建構動態子項 Meta 物件以執行輪詢。
內容名稱 | 範例值 |
---|---|
InputFormat | CUST_IN |
InputQueue | MYInputQueue |
OutputFormat | CxIgnore |
OutputQueue | CxIgnore |
ResponseTimeout | CxIgnore |
TimeoutFatal | CxIgnore |
如上表所示,您可在動態子項 Meta 物件中定義 InputQueue 這個額外的屬性。這個屬性包含已從中擷取指定訊息的佇列名稱。 如果子項 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]
您可將屬性新增到動態 Meta 物件,以取得訊息傳輸的詳細資訊及更多控制。新增此類屬性可讓您修改 JMS 內容、 控制每個要求的 ReplyToQueue (而不是使用指定在配接器內容中的預設 ReplyToQueue),及重設訊息 CorrelationID 為目標。本節說明以下屬性,以及它們如何影響同步及非同步模式的事件通知及要求處理。
在動態 Meta 物件中可以辨識反映 JMS 及 WebSphere MQ 標頭內容的下列屬性。
標頭屬性名稱 | 模式 | 對應的 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 物件。當在要求處理程序期間發出回應訊息時, 這些內容也會移入動態 MO。讀取/寫入屬性會在要求處理程序期間,於建立的訊息標頭上設定。在事件通知期間, 讀取/寫入屬性從訊息標頭中讀取,以移入動態 Meta 物件。
這些屬性的解譯及使用會在下節中說明。
與動態 Meta 物件中的其他屬性不同,JMSProperties 必須定義單一基數子項物件。此子項物件中的每個屬性都必須定義單一的內容, 以在 JMS 訊息標頭的不同部份中讀取/寫入,如下所示:
下表顯示您必須為 JMSProperties
物件中之屬性定義的應用程式特有資訊內容。
名稱 | 可能值 | 註解 |
---|---|---|
名稱 | 任何有效的 JMS 內容名稱 | 這是 JMS 內容的名稱。部份供應商會保留某些內容,以提供延伸的功能。一般而言,使用者不應該定義以 JMS 開頭的自訂內容,除非他們要存取這些供應商特有的功能。 |
類型 | String、Int、Boolean、Float、Double、Long、Short | 這是 JMS 內容的類型。JMS API 提供在「JMS 訊息」中設定值的許多方法:setIntProperty、setLongProperty、setStringProperty 等等。指定於此處的 JMS 內容類型指出這些方法中的哪個方法用於設定訊息中的內容值。 |
下面的圖例顯示動態 Meta 物件中的屬性 JMSProperties 及 JMS 訊息標頭中四個內容 (ID、GID、RESPONSE 及 RESPONSE_PERSIST) 的定義。屬性的應用程式特有資訊會定義每一個內容的名稱及類型。例如,屬性 ID 對映到類型 String 的 JMS 內容 ID。
如果具有標頭屬性的動態 Meta 物件存在於事件商業物件中,則連接器會執行下列步驟 (還有將與傳輸相關的資料輸入 Meta 物件):
對於同步的事件處理程序,配接器會在將回應訊息傳回應用程式之前公佈事件,並等待整合分配管理系統回應。 在傳回的回應訊息中會反映商業資料的任何變更。在公佈事件之前,配接器會按照非同步事件通知的說明,將資料輸入動態 Meta 物件。會在發出回應的標頭中反映動態 Meta 物件中設定的值,如下所述 (會忽略動態 Meta 物件中所有其他唯讀標頭屬性):
如果您沒有在 Meta 物件中定義屬性 CorrelationID,則連接器會自動處理 CorrelationID。
連接器會使用動態 Meta 物件 (若有的話) 在發出要求訊息之前將資料先輸入要求訊息。連接器會在傳送要求訊息之前,執行下列步驟:
連接器會使用動態 Meta 物件 (若有的話) 在發出要求訊息之前將資料先輸入要求訊息。如果動態 Meta 物件包含標頭屬性, 則連接器會將回應訊息中找到的對應新值輸入其中。連接器會在收到回應訊息之後,執行下列步驟 (還有將與傳輸相關之資料輸入 Meta 物件):
如果 JMS 內容無法從訊息中讀取,或無法寫入訊息,則連接器會記載錯誤,且要求或事件會失敗。如果使用者定義的 ReplyToQueue 不存在或無法存取它,則連接器會記載錯誤,且要求會失敗。如果 CorrelationID 無效或無法設定,則連接器會記載錯誤,且要求會失敗。在所有情況下,記載的訊息都來自連接器訊息檔。