Bagikan melalui


Masalah Desain Adapter

Konfigurasi adaptor disimpan dalam database Single Sign-On (SSO) saat pengguna membuat perubahan konfigurasi selama waktu desain. Pada durasi Mesin Olahpesan mengambil konfigurasi adaptor dan mengirimkannya ke adaptor. Empat jenis informasi konfigurasi dikirimkan ke adaptor:

  • Menerima konfigurasi handler

  • Menerima konfigurasi lokasi (titik akhir)

  • Mengirim konfigurasi handler

  • Mengirim konfigurasi lokasi (titik akhir)

Konfigurasi Penerima dan Kirim Handler

Konfigurasi handler adapter dikirimkan ke adaptor pada implementasi IPersistPropertyBag opsional. Muat antarmuka. Konfigurasi handler dikirimkan hanya sekali, jadi jika konfigurasi handler adapter diubah setelah layanan BizTalk memulai adaptor tidak diperbarui. Model umum adalah adaptor untuk memperlakukan konfigurasi handler sebagai konfigurasi default; Konfigurasi titik akhir mengambil alih konfigurasi handler berdasarkan per titik akhir.

Fragmen kode berikut menunjukkan penguraian konfigurasi. Konfigurasi adaptor ada di properti yang diteruskan ke panggilan Muat di properti string AdapterConfig. Nilai properti ini berisi dokumen XML yang mewakili konfigurasi adaptor. Adaptor perlu memuat konfigurasi ini ke dalam model objek dokumen (DOM) atau pembaca XML dan menggunakan JalurX untuk mengambil properti individual.

public class MyAdapter : IBTTransport,   
 IBTTransportConfig,   
 IBTTransportControl,  
 IPersistPropertyBag,   
 IBaseComponent  
{  
...  
// Handler configuration properties...  
private int defaultBatchSize = 0;  
private string defaultHeader;  
  
// IPersistPropertyBag.Load() implementation...  
public void Load(IPropertyBag pb, int pErrorLog)  
{  
// The adapter configuration is in the property  
 // “AdapterConfig” in the form of an Xml blob...  
object obj = null;  
pb.Read("AdapterConfig", out obj, 0);  
  
// Create a DOM and load the Xml blob...  
XmlDocument dom = new XmlDocument();  
string adapterConfig = (string)obj;  
dom.LoadXml(adapterConfig);  
  
// XPath the individual properties...  
XmlNode node =   
 document.SelectSingleNode(“/Config/batchSize”);  
defaultBatchSize = int.Parse(node.InnerText);  
  
node = document.SelectSingleNode(“/Config/header”);  
defaultHeader = node.InnerText;  
}  
}  

Menerima Konfigurasi Lokasi

Menerima informasi konfigurasi lokasi dikirimkan ke adaptor pada implementasi IBTTransportConfig. Antarmuka ini berisi tiga metode AddReceiveEndpoint, UpdateEndpointConfig, dan RemoveReceiveEndpoint. Mesin Olahpesan memberi tahu adaptor titik akhir mana yang perlu didengarkannya untuk menerima pesan. Ketika konfigurasi untuk titik akhir individual diubah, adaptor akan diberi tahu tentang perubahan untuk titik akhir tersebut. Hal ini berbeda dengan fakta bahwa ketika konfigurasi handler mengubah adaptor tidak diberi tahu. Demikian pula, adaptor tidak perlu menangani jendela layanan karena BizTalk Server menambahkan atau menghapus titik akhir karena jendela layanan menjadi aktif atau tidak aktif.

AddReceiveEndpoint

Ketika adaptor perlu mulai mendengarkan pada titik akhir, mesin memanggil IBTTransportConfig.AddReceiveEndpoint yang melewati URI lokasi penerima, tas properti yang berisi konfigurasi adaptor untuk titik akhir tersebut, dan tas properti kedua yang berisi konfigurasi khusus BizTalk Server untuk titik akhir tersebut. Adaptor perlu menulis URI ke konteks pesan sebagai properti sistem BizTalk Server InboundTransportLocation.

Membaca properti lokasi penerima dari tas properti adaptor sama dengan membaca konfigurasi handler seperti yang dijelaskan di atas. Konfigurasi BizTalk Server yang diteruskan ke adaptor berisi satu properti, TwoWayReceivePort, yang menunjukkan apakah port satu arah atau dua arah. Fragmen kode berikut menggambarkan cara mengevaluasi apakah port penerima adalah satu arah atau dua arah dari tas properti BizTalk Server:

public void AddReceiveEndpoint(  
 string  url,   
 IPropertyBag adapterConfig,   
 IPropertyBag bizTalkConfig )  
{  
...  
  
// The property "TwoWayReceivePort" in the BizTalk Config  
// property bag indicates whether the port is one or two  
 // way...  
  
 // Add receive location to config cache (not shown here)  
  
object obj = null;  
bizTalkConfig.Read("TwoWayReceivePort", out obj, 0);  
  
if ( null != obj )  
this.twoWay = (bool)obj;  
}  

UpdateEndpointConfig

Ketika konfigurasi lokasi terima aktif diubah, mesin menggunakan API UpdateEndpointConfig untuk memberi tahu adaptor bahwa ia perlu menggunakan konfigurasi yang berbeda. Semua konfigurasi dikirimkan ke adaptor, termasuk konfigurasi khusus BizTalk Server.

RemoveReceiveEndpoint

Ketika lokasi terima tidak lagi aktif, adaptor akan diberi tahu melalui RemoveReceiveEndpoint. Setelah adaptor kembali dari RemoveReceiveEndpoint , tidak lagi diizinkan untuk menggunakan URI tersebut untuk mengirimkan pesan ke mesin.

Kirim Konfigurasi Port

Mesin Olahpesan menulis konfigurasi untuk port kirim ke konteks pesan di namespace adaptor sebelum mengirimkan pesan ke adaptor. Merupakan tanggung jawab adaptor untuk membaca dan memvalidasi konfigurasi, yang kemudian digunakannya untuk mengontrol transmisi pesan. Untuk adaptor pengiriman yang mendukung pengiriman batch, pesan yang ditujukan untuk port pengiriman yang berbeda mungkin berada dalam batch yang sama, sehingga adaptor perlu menangani batch "campuran" ini.

Fragmen kode berikut menggambarkan cara membaca OutboundTransportLocation yang merupakan URI untuk port kirim. Ini juga menunjukkan cara membaca blob XML yang berisi konfigurasi adaptor dan kemudian membaca properti individual.

...  
 private static readonly PropertyBase UriProperty =   
 new BTS.OutboundTransportLocation();  
  
 private string propertyNamespace =   
  "http://schemas.mySchemas.com/MyAdapter/myadapter-properties";  
private string uri;  
private string headers;  
private int timeOut = 1000;  
  
private void ReadSendPortConfig(IBaseMessage msg)  
{  
// Read the OutboundTransportLocation,   
 // i.e. the send port uri....  
uri = (string)msg.Context.Read(  
 UriProperty.Name.Name, UriProperty.Name.Namespace);  
  
// Read the adapters configuration Xml blob from   
 // the message...  
XmlDocument locationConfigDom = null;  
object obj = msg.Context.Read(  
 "AdapterConfig", this.propertyNamespace);  
  
// If this is a dynamic send there will not be   
 // any configuration...  
if ( null != obj )  
{  
locationConfigDom = new XmlDocument();  
locationConfigDom.LoadXml((string)obj);  
  
this.headers = Extract(  
 locationConfigDom, "/Config/headers", true);  
  
 this.timeOut = ExtractInt32(  
 locationConfigDom, "/Config/timeOut", true);  
}  
}  
  
 // Helper method to XPath string properties...  
private static string Extract(  
 XmlDocument document, string path, bool required)  
{  
XmlNode node = document.SelectSingleNode(path);  
if (!required && null == node)  
return String.Empty;  
if (null == node)  
throw new ApplicationException(string.Format(  
 "No property was found at {0}", path));  
return node.InnerText;  
}  
  
  // Helper method to XPath int32 properties...  
private static int ExtractInt32(  
 XmlDocument document, string path, bool required)  
{  
string s = Extract(document, path, required);  
return int.Parse(s);  
}   

Tip Implementasi: Adaptor secara umum harus menggunakan properti konteks pesan OutboundTransportLocation untuk menentukan alamat tujuan pengiriman pesan. Dengan melakukan ini adaptor dapat menangani transmisi ke pengiriman statis dan dinamis secara konsisten. Ini juga menyederhanakan modifikasi alamat dalam file pengikatan produksi.

XSD

Empat file XSD yang disertakan dalam sampel Adaptor File SDK terutama menangani konfigurasi adaptor: ReceiveHandler.xsd, ReceiveLocation.xsd, TransmitLocation.xsd, dan TransmitHandler.xsd.

Topik berikut membahas masing-masing file ini dan menjelaskan bagaimana Anda dapat memodifikasinya.

Di Bagian Ini