使用BizTalk Server以累加方式接收 Oracle Database 變更通知
重要
為了簡潔起見,本主題只會說明如何以累加方式接收通知。 在商務案例中,協調流程必須包含邏輯,以擷取收到的通知訊息種類,然後執行任何後續作業。 換句話說,本主題所述的協調流程必須建置在處理通知訊息中所述的協調流程之上,才能使用 BizTalk Server 來完成 Oracle 資料庫中的特定工作。
本主題示範如何設定 Oracle 資料庫配接器,以接收來自 Oracle 的累加查詢通知訊息。 為了示範累加式通知,我們會考慮資料表 ACCOUNTACTIVITY,其中包含「已處理」資料行。 當新記錄插入此資料表時,「Processed」 資料行的值會設定為 'n'。 您可以執行下列動作,將配接器設定為接收累加通知:
使用 SELECT 語句註冊通知,以擷取具有 「Processed」 資料行的所有記錄為 'n'。 您可以藉由指定 NotificationStatement 系結屬性的 SELECT 語句來執行此動作。
對於已收到通知的資料列,請將 「Processed」 資料行更新為 'y'。
本主題示範如何建立 BizTalk 協調流程,並設定 BizTalk 應用程式以達成此目的。
使用 Oracle 資料庫配接器系結屬性設定通知
下表摘要說明您用來設定從 Oracle 資料庫接收通知的 Oracle 資料庫配接器系結屬性。 在 BizTalk Server 管理主控台中設定接收埠時,您必須指定這些系結屬性。
注意
在產生 通知 作業的架構時,您可以選擇指定這些系結屬性,即使它並非必要也一樣。 如果您這樣做,取用配接器服務增益集產生的通訊埠系結檔案也會包含您為系結屬性指定的值。 您稍後可以在 BizTalk Server 管理主控台中匯入此系結檔案,以建立已設定系結屬性的 WCF 自訂或 WCF-OracleDB 接收埠。 如需使用系結檔案建立接收埠的詳細資訊,請參閱 使用埠系結檔案設定實體埠系結至 Oracle Database。
Binding 屬性 | Description |
---|---|
InboundOperationType | 指定您想要執行的輸入作業。 若要接收通知訊息,請將此設定為 [通知]。 |
NotificationPort | 指定 ODP.NET 必須開啟的埠號碼,以接聽 Oracle 資料庫中的資料庫變更通知。 |
NotificationStatement | 指定用來註冊查詢通知的 SELECT 語句。 只有在指定 SELECT 語句的結果集變更時,配接器才會取得通知訊息。 |
NotifyOnListenerStart | 指定當接聽程式啟動時,配接器是否傳送通知給配接器用戶端。 |
如需這些屬性的更完整描述,請參閱 使用 BizTalk Adapter for Oracle 資料庫系結屬性。 如需如何使用 Oracle 資料庫配接器接收來自 Oracle 資料庫之通知的完整描述,請參閱進一步閱讀。
本主題示範如何接收通知訊息
在本主題中,為了示範 Oracle 資料庫配接器如何支援從 Oracle 資料庫接收累加資料庫變更通知訊息,我們將設定配接器以接收 ACCOUNTACTIVTY 資料表變更的通知。 讓我們假設 ACCOUNTACTIVITY 資料表有資料行 「TID」、「Account」 和 「Processed」。 每當加入新記錄時,「Processed」 資料行的值就會設定為 'n'。 因此,若要取得累加通知,您必須在 BizTalk 協調流程中執行下列工作:
取得 「Processed」 為 'n' 之所有記錄的通知。 您可以藉由將 SELECT 語句指定為通知語句來執行此動作。
收到特定記錄的通知之後,請將 「Processed」 設定為 'y'。 您可以執行預存程式 PROCESS_RECORDS,以更新 「Processed」 資料行來執行此動作。
為了示範接收累加式通知,我們會執行下列動作:
產生 通知 (輸入作業) 的架構 ,並在 ACCOUNTACTIVITY 資料表上 (輸出作業) PROCESS_RECORDS。
建立具有下列條件的協調流程:
接收通知訊息的接收位置。 您可以將 SELECT 語句指定為下列專案,以設定通知:
SELECT TID,ACCOUNT,PROCESSED FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’
注意
您必須指定資料表名稱以及架構名稱。 例如:
SCOTT.ACCOUNTACTIVITY
。傳送埠,用來更新已傳送通知的資料列。 您將在此埠上執行PROCESS_RECORDS預存程式,以針對收到通知的記錄,將 「Processed」 資料行的值設定為 'y'。
請注意,此作業必須在接收通知訊息之後執行,以便更新處理的資料列。 若要避免等候取得通知回應的額外負荷,然後手動卸載要求訊息以執行PROCESS_RECORDS程式,您將針對協調流程本身內的PROCESS_RECORDS程式產生要求訊息。 您可以使用協調流程內的 建構訊息 圖形來執行此動作。
如何從 Oracle 資料庫接收通知訊息
使用 Oracle Database 配接器搭配 BizTalk Server 在 Oracle 資料庫上執行作業牽涉到建置組塊中所述的程式性工作,以使用 Oracle Database 開發 BizTalk 應用程式。 若要設定配接器以接收通知訊息,這些工作如下:
建立 BizTalk 專案,然後在 ACCOUNTACTIVITY 資料表上產生 通知 (輸入作業) 和 PROCESS_RECORDS 程式 (輸出作業) 。 您可以選擇性地指定 InboundOperationType、 NotificationPort和 NotificationStatement 系結屬性的值。
在 BizTalk 專案中建立訊息,以接收來自 Oracle 資料庫的通知。
在 BizTalk 專案中建立訊息,以執行PROCESS_RECORDS預存程式和接收回應訊息。
建立執行下列動作的協調流程:
從 Oracle 資料庫接收通知訊息。
建立訊息以執行PROCESS_RECORDS程式。
將此訊息傳送至 Oracle 資料庫,以選取並更新記錄並接收回應。
建置和部署 BizTalk 專案。
藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。
注意
對於接收通知訊息之類的輸入作業,您只能設定單向 WCF-Custom 或 WCF-OracleDB 接收埠。 輸入作業不支援雙向接收埠。
啟動 BizTalk 應用程式。
本主題提供執行這些工作的指示。
產生架構
您必須產生 通知 作業和 PROCESS_RECORDS 程式的架構。 如需如何產生架構的詳細資訊,請參閱 在 Visual Studio 中擷取 Oracle 作業的中繼資料 。 產生架構時,請執行下列工作。 如果您不想在設計階段指定系結屬性,請略過第一個步驟。
在產生架構時,指定 InboundOperationType、 NotificationPort和 NotificationStatement 系結屬性的值。 如需這個系結屬性的詳細資訊,請參閱 使用 BizTalk Adapter for Oracle 資料庫系結屬性。 如需如何指定系結屬性的指示,請參閱 指定系結屬性。
選取合約類型作為 [服務 (輸入作業) 。
產生 通知 作業的架構。
選取合約類型作為 [用戶端 (輸出作業) 。
產生 PROCESS_RECORDS 程式的架構。 此程式可在 ACCOUNT_PKG 套件下取得。
定義訊息和訊息類型
您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 產生架構之後,您必須從 BizTalk 專案的協調流程檢視將其連結至訊息。
針對本主題,您必須建立三個訊息:一個接收來自 Oracle 資料庫的通知、一個用來執行PROCESS_RECORDS程式,另一個用來接收程式的回應。
執行下列步驟來建立訊息,並將其連結至架構。
建立訊息並連結至架構
將協調流程新增至 BizTalk 專案。 從方案總管,以滑鼠右鍵按一下 BizTalk 專案名稱,指向 [新增],然後按一下 [新增專案]。 輸入 BizTalk 協調流程的名稱,然後按一下 [ 新增]。
如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 [ 檢視],指向 [其他 Windows],然後按一下 [ 協調流程檢視]。
在 [ 協調流程檢視]中,以滑鼠右鍵按一下 [ 訊息],然後按一下 [ 新增訊息]。
以滑鼠右鍵按一下新建立的訊息,然後選取 [ 屬性視窗]。
在Message_1的 [屬性]窗格中,執行下列動作:
使用 作法 識別碼 輸入 NotifyReceive
。訊息類型 從下拉式清單中展開 [ 架構],然後選取 [OracleNotifyIncremental.OracleDBBinding.Notification],其中 OracleNotifyIncremental 是您 BizTalk 專案的名稱。 OracleDBBinding 是針對 通知 作業產生的架構。 重複步驟 3 以建立兩個新的訊息。 在新訊息的 [ 屬性] 窗格中,執行下列動作:
將識別碼設定為 將訊息類型設定為 程序 OracleNotifyIncremental.OracleDBBinding1.PROCESS_RECORDS,其中 OracleDBBinding1 是針對 PROCESS_RECORDS 程式產生的架構。 ProcedureResponse OracleNotifyIncremental.OracleDBBinding1.PROCESS_RECORDSResponse
設定協調流程
您必須建立 BizTalk 協調流程,以使用BizTalk Server從 Oracle 資料庫接收通知訊息,然後更新接收通知的資料列。 在此協調流程中,配接器會根據針對 NotificationStatement 系結屬性指定的 SELECT 語句來接收通知訊息。 通知訊息會在 FILE 位置接收。 收到回應之後,協調流程會建構訊息來叫用PROCESS_RECORDS程式,以更新接收通知的資料列。 此訊息的回應也會在相同的 FILE 位置接收。
因此,您的協調流程必須包含下列專案:
單向 WCF-Custom 或 WCF-OracleDB 接收埠來接收通知訊息。
雙向 WCF-Custom 或 WCF-OracleDB 傳送埠,以傳送訊息來執行PROCESS_RECORDS程式。
建 構訊息 圖形,可在協調流程內建構訊息,以執行PROCESS_RECORDS程式。
FILE 傳送埠,用來儲存通知訊息和PROCESS_RECORDS程式的回應。
接收和傳送圖形。
範例協調流程如下所示。
從 Oracle
新增訊息圖形
請確定您為每個訊息圖形指定下列屬性。 Shape 資料行中列出的名稱是訊息圖形的名稱,如剛才提及的協調流程所示。
圖形 | 圖形類型 | 屬性 |
---|---|---|
ReceiveNotification | 接收 | - 將 名稱 設定為 ReceiveNotification - 將 Activate 設定為 True |
SaveNotification | 傳送 | - 將 [名稱 ] 設定為 SaveNotification |
SendProcMessage | 傳送 | - 將 [名稱 ] 設定為 SendProcMessage |
ReceiveProcResponse | 接收 | - 將 [名稱 ] 設定為 ReceiveProcResponse |
SaveProcResponse | 傳送 | - 將 [名稱 ] 設定為 SaveProcResponse |
新增建構訊息圖形
您可以使用 建構訊息 圖形,在協調流程內產生要求訊息,以執行PROCESS_RECORDS程式。 若要這樣做,您必須將 建構訊息 圖形和該訊息 指派 圖形新增至協調流程。 在此範例中, 訊息指派 圖形會叫用程式碼,以產生傳送至 Oracle 資料庫的訊息來執行程式。 [ 訊息指派 ] 圖形也會設定要傳送至 Oracle 資料庫的訊息動作。
針對建構訊息圖形,將 Message Constructed 屬性設定為 Procedure。
產生回應的程式碼可能是與 BizTalk 專案相同的 Visual Studio 解決方案的一部分。 產生回應訊息的範例程式碼看起來像這樣。
namespace SampleMessageCreator
{
public class SampleMessageCreator
{
private static XmlDocument Message;
private static string XmlFileLocation;
private static string ResponseDoc;
public static XmlDocument XMLMessageCreator()
{
XmlFileLocation = "C:\\TestLocation\\MessageIn";
try
{
ResponseDoc = (Directory.GetFiles(XmlFileLocation, "*.xml", SearchOption.TopDirectoryOnly))[0];
}
catch (Exception ex)
{
Console.WriteLine("Trying to get XML from: " + XmlFileLocation);
Console.WriteLine("EXCEPTION: " + ex.ToString());
throw ex;
}
//Create Message From XML
Message = new XmlDocument();
Message.PreserveWhitespace = true;
Message.Load(ResponseDoc);
return Message;
}
}
}
若要讓上述程式碼摘錄能夠產生要求訊息,您必須有 XML 要求訊息 (PROCESS_RECORDS程式) 為變數指定 XmlFileLocation
的位置。
注意
建置專案之後,將會在專案目錄中建立 MessageCreator.dll。 您必須將此 DLL 新增至全域組件快取 (GAC) 。 此外,您必須在 BizTalk 專案中新增 MessageCreator.dll 作為參考。
新增下列運算式,以從 訊息指派 圖形叫用此程式碼,並設定訊息的動作。 若要新增運算式,請按兩下 [訊息指派 ] 圖形以開啟 [運算式編輯器]。
Procedure = SampleMessageCreator.SampleMessageCreator.XMLMessageCreator();
Procedure(WCF.Action) = "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG/PROCESS_RECORDS";
新增埠
請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中列出的名稱是協調流程中顯示的埠名稱。
連接埠 | 屬性 |
---|---|
OracleNotifyPort | - 將 識別碼 設定為 OracleNotifyPort - 將 類型 設定為 OracleNotifyPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 接收 |
SaveMessagePort | - 將 識別碼 設定為 SaveMessagePort - 將 類型 設定為 SaveMessagePortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 - 建立作業 通知。 此作業用於通知訊息。 - 建立作業 程式。 此作業用於選取回應訊息。 |
OracleOutboundPort | - 將 識別碼 設定為 OracleOutboundPort - 將 類型 設定為 OracleOutboundPortType - 將 通訊模式 設定為 Request-Response - 將 通訊方向 設定為 Send-Receive |
指定動作圖形的訊息並連接到埠
下表指定屬性及其值,您應該設定為指定動作圖形的訊息,以及將訊息連結至埠。 Shape 資料行中列出的名稱是訊息圖形的名稱,如先前所述的協調流程所示。
圖形 | 屬性 |
---|---|
ReceiveNotification | - 將 訊息 設定為 NotifyReceive - 將作業 設定為 OracleNotifyPort.Notify.Request |
SaveNotification | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 SaveMessagePort.Notify.Request |
SendProcMessage | - 將 訊息 設定為 程式 - 將 作業 設定為 OracleOutboundPort.Procedure.Request |
ReceiveProcResponse | - 將 訊息 設定為 ProcedureResponse - 將作業 設定為 OracleOutboundPort.Procedure.Response |
SaveProcResponse | - 將 訊息 設定為 ProedureResponse - 將 作業 設定為 SaveMessagePort.Procedure.Request |
指定這些屬性之後,訊息圖形和埠就會連線,而且您的協調流程已完成。
您現在必須建置 BizTalk 解決方案,並將其部署至BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程。
設定 BizTalk 應用程式
部署 BizTalk 專案之後,您稍早建立的協調流程會列在 [BizTalk Server 管理主控台] 的 [協調流程] 窗格中。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步解說,請參閱逐步解說 :部署基本 BizTalk 應用程式。
設定應用程式牽涉到:
選取應用程式的主機。
將您在協調流程中建立的埠對應至 BizTalk Server 管理主控台中的實體埠。 針對此協調流程,您必須:
定義實體 WCF-Custom 或單向接收埠 WCF-OracleDB。 此埠會接聽來自 Oracle 資料庫的通知。 如需如何建立接收埠的詳細資訊,請參閱 手動設定實體埠系結至 Oracle 資料庫配接器。 請確定您為接收埠指定下列系結屬性。
重要
如果您在設計階段指定系結屬性,則不需要執行此步驟。 在這種情況下,您可以藉由匯入取用配接器服務增益集所建立的系結檔案,以設定必要的系結屬性來建立接收埠。 如需詳細資訊,請參閱 使用埠系結檔案設定實體埠系結至 Oracle 資料庫。
Binding 屬性 值 InboundOperationType 將此設定為 [通知]。 NotificationPort 指定 ODP.NET 必須開啟的埠號碼,以接聽 Oracle 資料庫中的資料庫變更通知。 將此設定為您必須新增至 Windows 防火牆例外狀況清單的相同埠號碼。 如需如何將埠新增至 Windows 防火牆例外狀況清單的指示,請參閱 https://go.microsoft.com/fwlink/?LinkID=196959 。
重要: 如果您將此設定為預設值 -1,則必須完全停用 Windows 防火牆以接收通知訊息。NotificationStatement 將此設定為:
SELECT TID,ACCOUNT,PROCESSED FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’
注意: 您必須指定資料表名稱以及架構名稱。 例如:SCOTT.ACCOUNTACTIVITY
。NotifyOnListenerStart 將此設定為 True。 如需不同系結屬性的詳細資訊,請參閱 使用 BizTalk Adapter for Oracle 資料庫系結屬性。
注意
建議您在使用 Oracle 資料庫配接器執行輸入作業時,設定交易隔離等級和交易逾時。 您可以在設定 WCF-Custom 或 WCF-OracleDB 接收埠時新增服務行為來執行此動作。 如需如何新增服務行為的指示,請參閱 設定交易隔離等級和交易逾時。
定義實體 WCF-Custom 或 WCF-OracleDB 傳送埠,以將訊息傳送至 Oracle 資料庫,以執行PROCESS_REOCRDS程式。 您也必須在傳送埠中指定動作。
定義硬碟上的位置,以及 BizTalk 協調流程將從 Oracle 資料庫卸載訊息的對應檔案埠。 這些是從 Oracle 資料庫接收的通知訊息,以及您透過 WCF-Custom 或 WCF-OracleDB 傳送埠執行之PROCESS_RECORDS程式的訊息。
啟動應用程式
您必須啟動 BizTalk 應用程式,才能從 Oracle 資料庫接收通知訊息,以及執行PROCESS_RECORDS程式。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程。
在此階段,請確定:
WCF-Custom 或 WCF-OracleDB 單向接收埠,它會從 Oracle 資料庫接收通知訊息正在執行。
執行PROCESS_RECORDS程式的 WCF-Custom 或 WCF-OracleDB 傳送埠。
從 Oracle 資料庫接收訊息的 FILE 傳送埠正在執行。
作業的 BizTalk 協調流程正在執行。
執行作業
假設 ACCOUNTACTIVITY 資料表已經有一些記錄。 此外,請確定可在 C:\TestLocation\MessageIn 取得執行PROCESS_RECORDS程式的 XML 訊息。 XML 檔案應該如下所示:
<PROCESS_RECORDS xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG"/>
一旦啟動 BizTalk 協調流程,就會以相同的循序執行下列一組動作:
配接器會收到類似下列的通知訊息:
\<?xml version="1.0" encoding="utf-8" ?\> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Info>ListenerStarted</Info> <Source>OracleDBBinding</Source> <Type>Startup</Type> </Notification>
此訊息會通知接收埠以接收通知訊息。 請注意,元素的值
<Info>
是 「ListnerStarted」。配接器會執行PROCESS_RECORDS程式。 Oracle 資料庫的下一個回應是針對程式。
<?xml version="1.0" encoding="utf-8" ?> <PROCESS_RECORDSResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG"> <TABLE_DATA> <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element msdata:IsDataSet="true" name="NewDataSet"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="TID" type="xs:decimal" /> <xs:element minOccurs="0" name="ACCOUNT" type="xs:decimal" /> <xs:element minOccurs="0" name="PROCESSED" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns=""> <NewTable> <TID>1</TID> <ACCOUNT>100001</ACCOUNT> <PROCESSED>n</PROCESSED> </NewTable> <NewTable> ...... ...... </NewTable> ...... ...... </NewDataSet> </diffgr:diffgram> </TABLE_DATA> </PROCESS_RECORDSResponse>
這是 SELECT 語句在PROCESS_RECORDS程式中執行的回應。
PROCESS_RECORDS程式也會更新資料列,以將 PROCESSED 設定為 'y'。 因此,配接器會收到更新作業的另一個通知。
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Details> <NotificationDetails> <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName> <Info>32</Info> <QueryId>0</QueryId> </NotificationDetails> </Details> <Info>Update</Info> <ResourceNames> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string> </ResourceNames> <Source>Data</Source> <Type>Change</Type> </Notification>
請注意,元素
Info
包含 「Update」。第二個通知之後,配接器會再次執行PROCESS_RECORDS程式。 不過,現在因為沒有將 PROCESSED 資料行設定為 'n' 的記錄,所以程式會傳回空的回應,如下所示。
<?xml version="1.0" encoding="utf-8" ?> <PROCESS_RECORDSResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG"> <TABLE_DATA> <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element msdata:IsDataSet="true" name="NewDataSet"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="TID" type="xs:decimal" /> <xs:element minOccurs="0" name="ACCOUNT" type="xs:decimal" /> <xs:element minOccurs="0" name="PROCESSED" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns="" /> </diffgr:diffgram> </TABLE_DATA> </PROCESS_RECORDSResponse>
最佳做法
部署並設定 BizTalk 專案之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,因此您不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用 Oracle 資料庫配接器系結。