共用方式為


從 Oracle E-Business Suite 接收輪詢型數據變更訊息

Microsoft BizTalk Adapter for Oracle E-Business Suite 支援透過輪詢介面資料表、介面檢視、資料表和檢視來接收基於輪詢的資料變更訊息。 配接器會透過下列方式將訊息傳遞至您的應用程式:

  • 執行 SQL SELECT 查詢,以判斷數據是否可供輪詢。 您可以設定配接器定期或持續執行 SQL SELECT 查詢。

  • 針對 Oracle 資料表或檢視執行 SQL SELECT 查詢,或執行預存程式、函式或封裝程式和函式。

  • 在 Oracle E-Business Suite 上執行可選的輪詢後 PL/SQL 程式碼區塊。 此程式代碼區塊通常用於更新目標中查詢記錄上的欄位,或將查詢的記錄移至另一個數據表或檢視表。

  • 調用 POLL 操作或儲存過程、函式,或將公開為輪詢操作的封裝過程和函式,用以返回包含查詢結果的結果集。

    配接器會在 Oracle 交易內執行所有這些作業。

如何設定 Oracle E-Business 配接器,以使用系結屬性接收數據變更的訊息?

您可以藉由設定下列部分或所有系結屬性,設定 Oracle E-Business 配接器來接收資料變更的訊息。

綁定屬性 價值觀 預設 必要/選擇性
InboundOperationType 請確定值已設定為 輪詢 投票 必須的。 如果未明確設定,則會套用預設值。
PolledDataAvailableStatement 指定要執行的 SELECT 語句,以確定是否有任何資料可用於查詢特定資料表。 指定的語句必須傳回包含數據列和數據行的結果集。 結果集第一個單元格中的值會指出配接器是否執行 針對PollingInput 系結屬性指定的值。 如果結果的第一個儲存格包含正值,配接器就會執行輪詢語句。 例如,這個系結屬性的有效語句會是:

Select * from <table_name>

注意: 您不得指定這個系結屬性的預存程式。 此外,此語句不得修改 Oracle E-Business Suite 或基礎 Oracle 資料庫中的數據。
必須的。
PollingAction 指定輪詢作業的動作。 您可以使用「取用配接器服務」附加元件為操作產生的元數據,判斷特定操作的輪詢動作。 可選擇地使用 SELECT 語句在資料表和檢視表上進行輪詢的作業。
PollingInput 指定下列任一項:

- 應針對 Oracle E-Business Suite 執行的 SQL SELECT 語句。 此語句應該包含 FOR UPDATE 子句。 如需 FOR UPDATE 子句的相關資訊,請參閱在本主題後面的 Polling 語句中指定 FOR UPDATE 子句

- 請求要輪詢的封裝內的預存程序、函式,或一般程序或函式的訊息。
必須的。 將 PollingInput 設定為非 Null 值會啟用輪詢。
PollingInterval 請設定配接器查詢 Oracle E-Business Suite 的時間間隔,以秒為單位。 這個屬性會指定輪詢間隔和輪詢交易逾時。此值應該大於 Oracle E-Business Suite 上執行查詢和輪詢後語句所需的時間量,加上客戶端處理查詢數據並傳迴輪詢回應消息所需的時間量。 30 必須的。 如果未明確設定,則會套用預設值。
PollWhileDataFound 指定如果數據表中有可用的數據,Oracle E-Business 配接器是否忽略輪詢間隔並持續輪詢 Oracle E-Business Suite。 如果數據表中沒有可用的數據,配接器會還原為在指定的輪詢間隔執行 SQL 語句 必須的。 如果未明確設定,則會套用預設值。
PostPollStatement 設定為選擇性的 PL/SQL 程式代碼區塊,此區塊會在執行查詢之後由配接器執行,但在查詢數據傳回至用戶端之前。 選擇性。 如果未指定任何值,就不會執行 post poll 語句。

備註

如果您使用 WCF 服務模型或 WCF 通道模型,您也必須設定 AcceptCredentialsInUri 系結屬性。

在輪詢語句中指定 FOR UPDATE 子句

如果您使用 SELECT 語句做為輪詢語句,並執行會影響 SELECT 語句中所指定數據列的輪詢後語句,則必須在輪詢語句中使用 FOR UPDATE 子句。 指定 FOR UPDATE 子句可確保查詢語句所選取的記錄在交易期間被鎖定,並且查詢結束後的語句可以對其進行任何必要的更新。

謹慎

您可以在輪詢和輪詢後語句之間的時間範圍中,將更多記錄新增至符合輪詢後語句條件的數據表。 在這種情況下,輪詢後語句會更新滿足條件的所有記錄,而不只是在輪詢語句中選取的記錄。

如果指定了輪詢後語句,而且輪詢語句不包含 FOR UPDATE 子句,您將會遇到下列兩個條件之一:

  • 如果 TransactionIsolationLevel 設定為 ReadCommitted,輪詢後查詢將不會更新選取的數據列。

  • 如果 TransactionIsolationLevel 設定為 Serializable,當執行輪詢後語句時,會發生下列目標系統例外狀況(Microsoft.ServiceModel.Channels.Common.TargetSystemException):“ORA-08177 無法串行化此交易的存取權”。 在這種情況下,您必須設定 PollingRetryCount 系結屬性,以定義您想要配接器重試相同交易的次數。

    如需如何設定交易隔離等級的指示,請參閱 使用 Oracle E-Business Suite 設定交易隔離等級和交易逾時

    如果配接器用戶端設定為使用交易,並且在配接器中將 UseAmbientTransaction 系結屬性的值設定為 True,則輪詢和輪詢後的語句將在交易中執行。

    使用 FOR UPDATE 選項的輪詢查詢範例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE  

在輪詢語句中指定NOWAIT子句

您可能會遇到同時執行的線程存取被輪詢的資料表的情況,導致資料表中發生過多的內容爭用。 這可能會導致輪詢查詢遭到封鎖,以取得數據表數據列的鎖定。 如果您使用 SELECT 語句做為輪詢語句,您可能會想要在 SELECT 語句中指定 NOWAIT 關鍵詞以及 FOR UPDATE 關鍵詞。 如果輪詢查詢嘗試選取的資料列被鎖定,這會導致配接器內的輪詢查詢執行立即返回。 Oracle 通常會在這類情況下拋出例外。 同樣地,配接器用戶端可能會使用 PollingInterval 系結屬性來指定配接器客戶端必須重試輪詢數據的時間間隔。

具有NOWAIT 選項的輪詢查詢范例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT  

在輪詢語句中指定 SKIP LOCKED 子句

您可能會遇到一些情境,由於並行執行緒存取正在輪詢的資料表,輪詢查詢中所指定的 WHERE 子句結果集中的某些行可能會被鎖定。 例如,您的輪詢查詢會從資料表返回 6 筆資料列;其中有 4 筆已因其他交易而鎖定。 在此情況下,您可能會想要指定 SKIP LOCKED 關鍵詞以及 FOR UPDATE 關鍵詞,以指示資料庫嘗試鎖定 WHERE 子句所指定的數據列,並略過已鎖定的任何數據列。 WHERE 子句中解除鎖定的數據列會在交易期間鎖定,而輪詢後語句可以對其執行任何必要的更新,這樣這些數據列就不會再次輪詢。 這可確保您在 WHERE 子句所指定的所有資料列解除鎖定之前,不必等到接收輪詢訊息。

SKIP LOCKED 關鍵詞適用於當您在多部計算機上有適配器用戶端對資料庫中相同的資料表進行輪詢的場景。 您可以藉由設定輪詢作業,在適配器客戶端之間進行負載平衡,這樣您就能接收 WHERE 子句所指定、在當下時間點已解除鎖定的資料列的輪詢式資料變更訊息,然後更新資料列,以確保如果一個適配器客戶端收到了輪詢型資料變更訊息,其他客戶端不會收到相同的訊息。

使用 SKIP LOCKED 選項的輪詢查詢範例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE SKIP LOCKED  

有序傳遞支援(FIFO)

在生產環境中,輪詢可用來監視 Oracle E-Business Suite 中的數據變更。 配接器用戶端會使用 Oracle E-Business 配接器來接收這些數據變更的訊息。 根據業務場景,數據變更的訊息能否以正確的順序被適配器客戶端接收至關重要。

Oracle E-Business 配接器支援順序傳遞或先進先出(FIFO),以維護從 Oracle E-Business Suite 接收訊息的順序。 以下是一些與 Oracle E-Business 配接器輸入案例中 FIFO 支援相關的考慮。

  • 如果協調流程正在取用訊息,協調流程必須針對來自 Oracle E-Business 配接器接收埠的訊息設定已排序的傳遞集。

  • 如果傳送埠在內容型路由案例中處理訊息,則傳送埠必須為來自 Oracle E-Business 配接器接收埠的訊息設置有序傳遞。

    WCF-Custom 或 WCF-OracleEBS 配接器具有屬性 [失敗時暫停要求訊息 ],指定是否要暫停失敗輸入處理的要求訊息。 此屬性可以在 [錯誤處理] 區段底下的 [訊息] 索引標籤上設定 WCF-Custom 或 WCF-OracleEBS 接收埠。 下表列出不同案例,說明如何根據此屬性的設定及訊息訂閱者的狀態(協調流程或埠)來處理傳入訊息。

WCF-Custom 埠屬性 未列在清單中的訂閱者 已登記但已停止狀態的訂閱者
「失敗時暫停要求訊息」屬性未設置 - 路由失敗報告會以暫停(無法繼續)的訊息形式產生

- 未暫停實際訊息

- 由於交易中止,後續查詢不會被執行。 因此,輪詢會重複並再次擷取數據列。

- 事件記錄檔中報告的錯誤,以描述所發生的情況。
- 未視為「失敗」。 事件記錄檔中沒有任何錯誤訊息。

- 實際訊息會放入可恢復的暫停佇列中。

- 當訂閱通訊埠或協調流程啟動時,訊息會自動恢復。 如果在訂閱者上設定已排序的傳遞,則會接受。

- 訊息的傳送也可以手動恢復。
"在失敗時暫停請求消息"屬性已被設置 - 路由失敗報告會以暫停(無法繼續)的訊息形式產生

- 實際訊息也會暫停

- 由於交易中止,後續查詢不會被執行。 因此,輪詢會重複並再次擷取數據列。

- 事件記錄檔中報告的錯誤,以描述所發生的情況。
- 未視為「失敗」。 事件記錄檔中沒有任何錯誤訊息。

- 實際訊息會放入可恢復的暫停佇列中。

- 當訂閱通訊埠或協調流程啟動時,訊息會自動恢復。 如果在訂閱者上設定已排序的傳遞,則會接受。

- 訊息的傳送也可以手動恢復。

另請參閱

開發活動
透過 BizTalk Server 輪詢 Oracle E-Business Suite