Bagikan melalui


Cara Menghentikan Adapter

Topik berikut memberikan panduan tentang pematian adaptor yang tepat.

Mengakhiri Adapter

Ketika Mesin Olahpesan dimatikan, mesin akan memanggil IBTTransportControl. Hentikan pada setiap adaptor dalam proses. Setelah metode ini mengembalikan BizTalk Server akan menghancurkan adaptor. Untuk adaptor asli ini terjadi segera, tetapi untuk adaptor terkelola persis ketika ini terjadi kurang deterministik karena proses pengumpulan sampah .NET. Adaptor harus memblokir di Hentikan dan melakukan pekerjaan pembersihan yang diperlukan sampai siap untuk dihancurkan.

Mengakhiri Adaptor Penerimaan Terisolasi

Adaptor penerima yang terisolasi tidak memiliki Hentikan yang dipanggil karena mereka tidak dihosting di layanan BizTalk. Sebaliknya, mereka harus memanggil IBTTransportProxy. TerminateIsolatedReceiver untuk memberi tahu Mesin Olahpesan bahwa mereka akan dimatikan.

Bersihkan Objek COM dengan Menggunakan Marshal.ReleaseComObject

Saat menulis kode terkelola yang menggunakan objek COM, runtime bahasa umum (CLR) menghasilkan objek proksi yang menyimpan referensi ke objek COM. Objek proksi adalah objek terkelola dan tunduk pada aturan pengumpulan sampah yang biasa. Masalah muncul karena pengumpul sampah hanya melihat memori yang dialokasikan runtime .NET, dan tidak mengetahui objek COM. Karena objek proksi kecil, objek COM besar mungkin tertinggal dalam memori karena pengumpul sampah CLR tidak menyadarinya.

Untuk menghindari masalah ini, rilis objek COM yang mendasarinya secara eksplisit ketika Anda selesai dengannya, terutama objek IBTTransportBatch . Anda melakukan ini dengan memanggil Marshal. ReleaseComObject.

Catatan

ReleaseComObject mengembalikan jumlah referensi yang tersisa dan hanya merilis objek COM ketika nilai yang dikembalikan ini adalah nol. Seringkali ReleaseComObject dipanggil dalam perulangan untuk memastikan bahwa objek dirilis. Setelah itu selesai, Anda harus memanggil SuppressFinalize pada objek ini karena tidak ada yang harus diselesaikan. Salah satu langkah terakhir adalah memeriksa apakah ini benar-benar objek COM.

Kode berikut menunjukkan proses yang dijelaskan di atas:

if (Marshal.IsComObject (batch))  
(  
While (0 <Marshal.ReleaseComObject(batch)  
;  
GC.SuppressFinalize (batch);  
  

Secara eksplisit merilis objek IBTTransportBatch yang dikembalikan dari GetBatch dapat membuat peningkatan performa yang signifikan.

Selalu Gunakan Hentikan Saat Menutup Adapter

Agar BizTalk Server mengenali kode Anda sebagai adaptor, Anda harus menerapkan antarmuka yang disebut IBTTransportControl. Antarmuka ini mendefinisikan bagaimana BizTalk Server berkomunikasi dengan adaptor Anda, dan didefinisikan sebagai berikut:

public interface IBTTransportControl   
{  
void Initialize(IBTTransportProxy transportProxy);  
void Terminate();  
}  

Antarmuka berisi dua metode, Inisialisasi dan Hentikan.

Initialize

BizTalk Server memanggil metode Inisialisasi setelah memuat rakitan adaptor. Ini dilakukan untuk meneruskan proksi transportasi (handel utama ke BizTalk Server) ke adaptor. Implementasi Inisialisasi hanya menyimpan proksi transportasi dalam variabel anggota.

Hentikan

BizTalk Server memanggil metode Hentikan pada pematian layanan untuk memberikan waktu adaptor untuk menyelesaikan eksekusi semua batch. Hal ini membuat implementasi metode Penghentian jauh lebih terlibat.

Adaptor tidak boleh kembali dari panggilan Hentikan sampai pekerjaan yang tertunda selesai. Ketika BizTalk Server memanggil Hentikan, adaptor harus mencoba menghentikan semua tugasnya saat ini dan tidak memulai yang baru.

Karena Penghentian disebut sebagai bagian dari pematian layanan, manajer kontrol layanan mengakhiri proses jika adaptor secara abadi memblokir di Hentikan. Dalam hal ini, Anda melihat peringatan dari manajer kontrol layanan saat menghentikan layanan BizTalk Server. Jika memungkinkan, hindari mengakhiri adaptor sebelum waktunya seperti ini. Jika adaptor tidak menangani proses penghentian dengan tepat, dan masih memiliki utas yang berjalan ketika proses mulai dimatikan, maka Terkadang Anda mungkin melihat pelanggaran akses dari BizTalk Server saat dimatikan.

Karena sifat asinkron antarmuka ke BizTalk Server, kemungkinan bahwa di bawah beban akan ada banyak batch dan oleh karena itu utas masih dijalankan. Panggilan Hentikan harus diimplementasikan untuk menunggu kesimpulan setiap batch adaptor telah berhasil dijalankan di BizTalk Server sebelum melanjutkan. Kesimpulan batch disinyalkan oleh panggilan balik BatchComplete dari BizTalk Server. Panggilan Hentikan harus menunggu setiap BatchComplete yang tertunda terjadi. Namun, eksekusi batch harus berhasil. Artinya, panggilan ke IBTTransportBatch::Done tidak boleh gagal. Jika panggilan ke IBTTransportBatch::Done gagal, tidak ada panggilan balik batch.

Setelah Anda menyadari bahwa Anda harus menambahkan kode sinkronisasi ke adaptor Anda, implementasinya cukup mudah.

Salah satu pendekatan sederhana adalah menerapkan objek sinkronisasi senyawa dengan metode enter and leave untuk utas pekerja dan metode penghentian yang memblokir saat utas masih dalam eksekusi yang dilindungi. (Kebetulan, solusinya sangat mirip dengan struktur multi-pembaca, penulis tunggal yang akrab di mana utas pekerja dapat dianggap sebagai pembaca dan metode penghentian sebagai penulis.)

Metode penghentian adalah sebagai berikut:

void terminate ()  
{  
this.control.Terminate();  
}  

Untuk setiap utas pekerja:

If (!this.control.Enter())  
return; // we can’t enter because Terminate has been called  
try  
{  
//  create and fill batch  
batch.Done();  
}  
catch (Exception)  
{  
//  we are not expecting a callback  
This.control.Leave();  
}  

Dalam panggilan balik dari BizTalk Server:

batchComplete (…)  
{  
//  the callback from BizTalk Server  
//  process results  
this.control.Leave();  
}  

BizTalk Server dikirim dengan kode sampel ControlledTermination.cs dalam sampel Base Adapter, memperlihatkan mekanisme sinkronisasi yang dijelaskan di sini.