事件處理

實作事件處理程序功能的首要步驟,就是將商業程序 -- 協同作業 -- 顯現為 Web 服務。 然後您要將此 Web 服務發佈於 UDDI 登錄中 (舉例說明),並配置連接器來 回應呼叫協同作業的 Web 服務用戶端。

於事件處理程序期間,連接器會使用通訊協定接聽器及 SOAP 資料處理常式, 將 Web 服務用戶端的 SOAP 要求訊息轉換成商業物件,以供顯現為 Web 服務的協同作業操作。 於事件處理程序中,通訊協定接聽器扮演著很重要的角色。

通訊協定接聽器

Web 服務要求可能來自各種傳輸埠,包括 HTTP、HTTPS 及 JMS。 Web 服務通訊協定接聽器會監視這些要求到達其傳輸通道的狀況。 通訊協定接聽器及對應的通道有三種:

這些中每一種都由其傳輸通道上接聽的執行緒所構成。 當它接收來自用戶端的 SOAP 要求訊息時,接聽器會向通訊協定接聽器組織架構登錄該事件。

通訊協定接聽器組織架構負責管理通訊協定接聽器,在有資源可用時,將要求排程。 當您設定連接器特有的內容值時,您要配置接聽器及通訊協定接聽器組織架構的各個層面。 於通訊協定接聽器組織架構內容中,您可以配置的項目如下:

這二個連接器特有的內容,可控制記憶體配置,防止通訊協定接聽器以無止盡的 Web 服務事件來癱瘓連接器。 配置演算法如下:在任何時候,連接器可接收的事件總數等於 WorkerThreadCount + RequestPoolSize。 它可以並行處理 WorkerThreadCount 的要求數。

您可於通訊協定接聽器組織架構中插入額外的通訊協定接聽器。 如需進一步資訊,請參閱建立多重通訊協定接聽器連接器特有的配置內容

SOAP/HTTP 及 SOAP/HTTPS 通訊協定接聽器處理程序

SOAP/HTTP(S) 通訊協定接聽器包含一個執行緒,可持續接聽來自 Web 服務用戶端的 HTTP(S) 要求。 接聽器執行緒連結了指定於「主機與埠」連接器特有配置 (接聽器) 內容中的主機和埠。 另一個配置內容 -- RequestWaitTimeout-- 則定義了於檢查連接器是否關閉之前, 接聽器要等待要求的時間間隔。

圖 24 說明同步作業的 SOAP/HTTP 通訊 協定接聽器處理程序。

圖 24. SOAP/HTTP 通訊協定接聽器:同步的事件處理程序


圖 25 顯示非同步作業的 SOAP/HTTP 通訊 協定接聽器處理程序。

圖 25. SOAP/HTTP 通訊協定接聽器:非同步的事件處理程序


當 Web 服務用戶端起始 SOAP/HTTP 或 SOAP/HTTPS 要求時,它會將 SOAP 要求訊息 登記在 SOAP/HTTP 或 SOAP/HTTPS 接聽器的 URL。 用戶端應使用 HTTP POST 方法來呼叫通訊協定接聽器 URL。

當 HTTP(S) 要求到達時,接聽器會向通訊協定接聽器組織架構登錄該要求, 排定該事件於有資源可用時,加以處理。 然後接聽器會從要求擷取通訊協定標頭及內容。

表 27 彙總接聽器所使用的 規則優先順序,以決定入埠訊息的 Charset、MmeType、ContentType 及 Content-Type 標頭。


表 27. 入埠訊息的 SOAP/HTTP(s) 通訊協定接聽器處理程序規則
優先順序 Charset MimeType ContentType Content-Type 標頭
1 來自送入的 HTTP 訊息 Content-Type 標頭值的 Charset 參數值 此接聽器的 URLsConfiguration 連接器內容值 來自 Content-Type 標頭值的送入的 HTTP 訊息類型/子類型值 送入的 HTTP 訊息 Content-Type 標頭
2 此接聽器的 URLsConfiguration 內容值 SOAPDHMimeType 連接器內容值

3 如果要求訊息 ContentType 的類型為 text 且具有任何子類型 (例如 text/xmltext/plain 等),則預設值為 ISO-8859-1。 否則將不會使用 charset。 預設為 ContentType

表 27 所示:

若以非同步的方式來呼叫協同作業,接聽器會傳遞要求商業物件至整合分配管理系統, 並以 HTTP 狀態碼 202 Accepted 來回應 Web 服務用戶端。接聽器處理程序到此結束。

若為同步的呼叫,接聽器就會同步呼叫協同作業。而協同作業則會以「SOAP 回應」商業物件來回應。

在決定回應訊息的 Charset、MimeType、ContentType 及 ContentType 標頭時,表 28 會彙總接聽器所使用的規則優先順序。


表 28. 離埠同步回應訊息的 SOAP/HTTP(s) 通訊協定接聽器處理規則
優先順序 Charset MimeType ContentType Content-Type 標頭
1 Protocol ConfigMO Content-Type 標頭 TLO 中的 MimeType 內容 Protocol ConfigMO Content-Type 標頭 Protocol ConfigMO Content-Type 標頭
2 TLO 中的 Charset 內容值 要求訊息 MimeType,但僅限要求與回應 ContentType 相符時。 要求訊息 ContentType 使用 ContentType 及 Charset 來建構 Content-Type 標頭
3 要求訊息 Charset,但僅限要求與回應 ContentType 相符時。 SOAPDHMimeType 連接器內容值

4 如果 ContentType 為 text/*,則預設值為 ISO-8859-1。 否則將不會使用 charset。 使用 ContentType 值作為 MimeType

表 28 所示:

接聽器會處理 HTTP Protocol Config MO。協同作業要負責確定, 在「要求-回應」事件的環境定義中,傳遞至 HTTP Protocol Config MO 中的標頭值是正確的。接聽器會根據下列規則,載入標準標頭和自訂內容:

  1. 接聽器會調查 HTTP Protocol Config MO 的每個項目,以忽略特殊屬性 (例如 ObjectEventId)。
  2. 每個非空值的標頭都會放在外送訊息,且有可能發生其他處理程序 (例如 Content-Type 標頭)。
  3. 請記得,利用上述方法時,接聽器可能會在訊息中設定非標準的標頭,但不會檢查該訊息的邏輯及語法是否正確。
  4. 若 HTTP Protocol Config MO UserDefinedProperties 中有一或數項自訂內容,接聽器便會在 「實體標頭區段」(最後一個標頭區段) 中新增它們。如需自訂內容的相關資訊,請參閱事件處理程序的使用者定義內容

註:
在 HTTP Protocol Config MO 中指定下列任一標頭,很有可能會導致不正確的 HTTP 訊息:Connection、Trailer、Transfer-Encoding、Content-Encoding、 Content-Length、Content-MD5、Content-Range。

然後接聽器會呼叫 SOAP 資料處理常式,將「協同作業」所傳回的「回應」商業物件轉換為 SOAP 回應訊息。

接聽器將回應訊息傳遞至 Web 服務用戶端,並包含 200 OK HTTP 狀態碼。 若協同作業傳回「SOAP 錯誤」商業物件,就會轉換成「錯誤」訊息。 此錯誤訊息會與 500 Internal Server Error HTTP 程式碼一起傳遞至 Web 服務用戶端。

然後接聽器會關閉連線,而處理事件的執行緒會變成可用的狀態。

不受支援的 SOAP/HTTP 通訊協定接聽器處理程序功能

SOAP/HTTP 通訊協定接聽器不支援下列各項:

使用安全 Socket 的 SOAP/HTTPS 接聽器處理程序

SOAP/HTTPS 通訊協定接聽器處理程序與 SOAP/HTTP 通訊協定接聽器處理程序區段中 所描述的相同,但 HTTPS 使用安全的 Socket。 如需進一步資訊,請參閱SSL

SOAP/JMS 通訊協定接聽器處理程序

SOAP/JMS 通訊協定接聽器包含一個執行緒,可持續接聽 InputQueue (來自 Web 服務用戶端之 要求的 JMS 目的地)。 RequestWaitTimeout 連接器配置內容可定義,在檢查連接器是否關閉之前, 接聽器等待要求的時間有多長。

圖 26 顯示同步作業的 SOAP/JMS 通訊協定接聽器處理程序。 該圖例並未顯示 JMS 提供者資訊。

圖 26. SOAP/JMS 通訊協定接聽器:同步的事件處理程序


圖 27 顯示非同步作業的 SOAP/JMS 通訊協定接聽器處理程序。

圖 27. SOAP/JMS 通訊協定接聽器:非同步的事件處理程序


註:
若 LookupQueueUsingJNDI 配置內容設定為 true, 則 SOAP/JMS 通訊協定接聽器使用 JNDI 來查閱佇列。 JNDI 內容指定於連接器內容中。 如需進一步資訊,請參閱連接器及 JMS, 以及連接器特有的配置內容中的 JNDI 相關內容。
當 Web 服務用戶端起始 SOAP/JMS 要求時,其會傳送 SOAP 要求訊息至 SOAP/JMS 接聽器所接聽的 InputQueue。 當它接收來自 InputQueue 的 SOAP 要求訊息時,SOAP/JMS 通訊協定接聽器會 向通訊協定接聽器組織架構登錄該要求。 通訊協定接聽器組織架構會隨著資源的可用狀態要求排程。
註:
若連接器配置內容 InDoubtEvents 的設定為 Reprocess, 則通訊協定接聽器組織架構會先排定來自 InProgressQueue 的 JMS 訊息,再排定來自 InputQueue 的訊息。

然後接聽器會將此訊息 --主體及必要的 JMS 標頭 (JMSCorrelationID、JMSMessageID、 JMSPriority、JMSExpiration、JMSDeliveryMode、JMSReplyTo、JMSTimeStamp、JMSType)-- 分派至 InProgressQueue。 接著,通訊協定接聽器組織架構會登錄事件。

接聽器讀取來自 InProgressQueue 的 JMS 訊息,擷取訊息的主體及下列標頭:

JMSType 的格式可為 TextMessage 或 BytesMessage。若為 TextMessage 格式,接聽器會透過「字串 API」,以擷取為「字串」的 「Web 服務要求」訊息來呼叫資料處理常式。 若為 BytesMessage,接聽器會透過「位元組資料處理常式 API」,以擷取為位元組陣列的 「Web 服務要求」訊息來呼叫資料處理常式。

接聽器使用 SOAPDHMimeType 連接器配置內容來呼叫 SOAP 資料處理常式, 將要求訊息轉換成「SOAP 要求」商業物件。 若於轉換期間發生錯誤,且已指定 JMSReplyTo JMS 標頭,接聽器便會以 SOAP 錯誤訊息來回應, 並將 faultcode 設定為 Client,將 faultstring 設定為 Cannot Parse。 錯誤訊息不提供其他細節。

接聽器使用資料處理常式所傳回之「SOAP 要求」商業物件的物件層次 cw_mo_jms ASI, 來決定 Protocol Config MO。 請注意,就事件處理程序而言,ASI 和 Protocol Config MO 都是選用性的。 若它找到 Protocol Config MO,接聽器就會用之前所擷取的 JMS 訊息標頭來載入資料。 表 42 顯示 Protocol Config MO 與 JMS 訊息標頭之間 屬性的對映關係。


表 29. JMS 標頭與 Protocol Config MO 屬性的對映表
Protocol Config MO 屬性 JMS 標頭名稱 說明
CorrelationID JMSCorrelationID 來自要求訊息的 JMSCorrelationID 標頭
MessageId JMSMessageId 來自要求訊息的 JMSMessageID 標頭
優先順序 JMSPriority 來自要求訊息的 JMSPriority 標頭
Expiration JMSExpiration 來自要求訊息的 JMSExpiration 標頭
DeliveryMode JMSDeliveryMode 來自要求訊息的 JMSDeliveryMode 標頭
ReplyTo JMSReplyTo 來自要求訊息的 JMSReplyTo 標頭。 JMS API 以 JMSDestination 的形式傳回此標頭,但 SOAP/JMS 通訊協定接聽器則是傳回佇列名稱。
Timestamp JMSTimestamp 來自要求訊息的 JMSTimestamp 標頭
Redelivered JMSRedelivered 來自要求訊息的 JMSRedelivered 標頭
類型 JMSType 來自回應訊息的 JMSType 標頭
Destination JMSDestination 來自要求訊息的 JMSDestination 標頭

如果 SOAP/JMS Protocol Config MO 的 UserDefinedProperties 屬性中有一或多個自訂內容, 則接聽器就會嘗試從訊息中擷取其值,並移入 UserDefinedProperties 商業物件。如需自訂內容的相關資訊,請參閱事件處理程序的使用者定義內容

若整合分配管理系統沒有訂閱 TLO (若為「非 TLO SOAP 要求」商業物件),接聽器就會記載錯誤。 若要求訊息中指定了 JMSReplyTo 標頭,接聽器就會建立 SOAP 錯誤訊息,並將其置於 JMSReplyTo 佇列中。 faultcode 的設定為 Client,而 faultString 的設定為 Not subscribed to this message。 錯誤訊息中沒有提供其他細節。若配置指定這麼做,接聽器亦會將原始的 JMS 要求訊息 (包括其 JMS 標頭) 保存於 UnsubscribedQueue 中。

若以非同步的方式呼叫協同作業,接聽器會傳遞「要求」商業物件至整合分配管理系統。 然後接聽器會將訊息從 InProgressQueue 移除。 若配置指定這麼做,接聽器亦會將原始的 JMS 要求訊息 (包括其 JMS 標頭) 保存於 ArchiveQueue 中。

若於非同步處理程序期間發生錯誤,且已指定 JMSReplyTo,接聽器就會以錯誤訊息來回應。 其 faultcode 的設定為 Server,且其 faultstring 的設定為 Internal Error。 若配置指定這麼做,接聽器亦會將原始的 JMS 要求訊息 (包括其 JMS 標頭) 保存於 ErrorQueue 中。

若為同步的呼叫,接聽器就會同步呼叫協同作業。而協同作業則會以「SOAP 回應」商業物件來回應。接聽器會呼叫 SOAP 資料處理常式,將「協同作業」所傳回的「回應」商業物件轉換為 SOAP/JMS 回應訊息。 接聽器會將回應訊息傳遞至 ReplyTo 佇列 (此為原始要求訊息上的 JMSReplyTo 標頭所提供)。 接聽器然後將資料處理常式所傳回的回應訊息設定為 TextMessage, 並設定表 30 中所顯示的標頭。


表 30. SOAP/JMS 通訊協定接聽器於回應訊息中所設定的標頭值
JMS 標頭名稱
JMSCorrelationId 要求訊息的 JMSMessageId
JMSDeliveryMode 要求訊息的 JMSDeliveryMode
JMSPriority 要求訊息的 JMSPriority
JMSExpiration 要求訊息的 JMSExpiration
JMSRedelivered 要求訊息的 JMSRedelivered
JMSReplyTo 要求訊息的 JMSReplyTo
JMSTimestamp 要求訊息的 JMSTimestamp
JMSType 要求訊息的 JMSType

如果在「回應」或「錯誤」商業物件的 JMS Protocol Config MO UserDefinedProperties 屬性中出現「JMS 自訂內容」,接聽器將會在回應訊中設定它們。

若配置指定這麼做,接聽器便會將原始的 JMS 訊息 (來自 Web 服務用戶端的要求) 及 其標頭從 InProgressQueue 移至 ArchiveQueue。

若發生錯誤,且已指定 JMSReplyTo,接聽器便會以錯誤訊息來回應, 且若配置指定這麼做,接聽器亦會將原始的 JMS 要求訊息保存於 ErrorQueue。

事件持續性及遞送

事件持續性取決於通訊協定:

事件排序

連接器可使用任何順序來傳遞事件。

事件觸發

事件觸發機制取決於通訊協定接聽器的配置內容。

註:
連接器不會分辨「建立」或「更新」或「擷取」或「刪除」。 這些事件皆遵循相同的做法。

事件偵測

事件偵測由各個通訊協定接聽器所執行。 事件偵測機制完全取決於傳輸,及您為各個接聽器配置連接器特有內容的方式。 如需這些內容的相關資訊,請參閱連接器特有的配置內容

事件狀態

事件狀態是由通訊協定接聽器所管理,並取決於傳輸埠,及您配置接聽器的方式。

事件擷取

事件擷取是由通訊協定接聽器所管理,並取決於傳輸埠,及您配置接聽器的方式。

事件保存

事件保存是由通訊協定接聽器所管理,並取決於傳輸埠,及您配置接聽器的方式。

事件回復

事件回復是由通訊協定接聽器所管理,並取決於傳輸埠,及您配置接聽器的方式。


表 31. SOAP/JMS 通訊協定接聽器於回應訊息中所設定的標頭值
InDoubtEvents 值 事件回復處理程序
FailOnStartup 若它在 InProgressQueue 中發現事件,接聽器會記載嚴重錯誤,並立即關閉。
Reprocess 若它在 InProgressQueue 中發現事件,接聽器會先處理那些事件。 接聽器可追蹤於 InProgressQueue 中所發現的訊息個數。
Ignore 會忽略 InProgressQueue 中的事件。接聽器可追蹤於 InProgressQueue 中所發現的 事件,及接聽器忽略那些事件的狀況。
LogError 若它在 InProgressQueue 中發現事件,接聽器會記載錯誤,並繼續處理。

Copyright IBM Corp. 1997, 2003