Titik Akhir Layanan dan Pengalamatan Antrean
Topik ini membahas cara klien menangani layanan yang membaca dari antrean dan cara titik akhir layanan dipetakan ke antrean. Ingat, ilustrasi berikut menunjukkan penyebaran aplikasi antrean Windows Communication Foundation (WCF) klasik.
Agar klien mengirim pesan ke layanan, klien mengalamatkan pesan ke Antrean Target. Agar layanan membaca pesan dari antrean, layanan menetapkan alamat pendengarnya ke Antrean Target. Menentukan alamat di WCF berbasis Pengidentifikasi Sumber Daya Seragam (URI) sedangkan nama antrean Message Queuing (MSMQ) tidak berbasis URI. Oleh karena itu penting untuk memahami cara mengatasi antrean yang dibuat di MSMQ menggunakan WCF.
Mengalamati MSMQ
MSMQ menggunakan jalur dan nama format untuk mengidentifikasi antrean. Jalur menentukan nama host dan QueueName
. Secara opsional, mungkin ada Private$
di antara nama host dan QueueName
untuk menunjukkan antrean pribadi yang tidak dipublikasikan di layanan direktori Active Directory.
Nama jalur dipetakan ke "FormatNames" untuk menentukan aspek tambahan dari alamat, termasuk perutean dan protokol transfer manajer antrean. Manajer Antrean mendukung dua protokol transfer: protokol MSMQ asli dan Protokol Olahpesan Andal SOAP (SRMP).
Untuk informasi selengkapnya tentang jalur MSMQ dan nama format, baca Tentang Antrean Pesan.
NetMsmqBinding dan Mengalamati Layanan
Saat menangani pesan ke layanan, skema di URI dipilih berdasarkan transportasi yang digunakan untuk komunikasi. Setiap transportasi di WCF memiliki skema yang unik. Skema harus mencerminkan sifat transportasi yang digunakan untuk komunikasi. Misalnya net.tcp, net.pipe, HTTP, dan sebagainya.
Transportasi antrean MSMQ di WCF memperlihatkan skema net.msmq. Setiap pesan yang dialamatkan menggunakan skema net.msmq dikirim menggunakan NetMsmqBinding
melalui saluran transportasi antrean MSMQ.
Mengalamati antrean di WCF didasarkan pada pola berikut:
net.msmq: // <host-name> / [private/] <queue-name>
di mana:
<host-name> adalah nama komputer yang meng-hosting Antrean Target.
[pribadi] adalah opsional. Nama ini digunakan saat mengalamati Antrean Target yang merupakan antrean pribadi. Untuk mengatasi antrean publik, Anda tidak boleh menentukan pribadi. Perhatikan bahwa, tidak seperti jalur MSMQ, tidak ada "$" dalam formulir URI WCF.
<queue-name> adalah nama antrean. Nama antrean juga bisa merujuk ke subantrean. Dengan demikian, <queue-name> = <name-of-queue>[;sub-queue-name].
Example1: Untuk mengalamati antrean pribadi PurchaseOrders yang dihosting di komputer abc atadatum.com, URI-nya akan menjadi net.msmq://abc.adatum.com/private/PurchaseOrders.
Example2: Untuk mengalamati antrean publik AccountPayable yang dihosting di komputer def atadatum.com, URI-nya akan menjadi net.msmq://def.adatum.com/AccountsPayable.
Alamat antrean digunakan sebagai URI Dengarkan berdasarkan Pendengar untuk membaca pesan. Dengan kata lain, alamat antrean setara dengan port mendengarkan dari soket TCP.
Titik akhir yang membaca dari antrean harus menentukan alamat antrean menggunakan skema yang sama yang ditentukan sebelumnya saat membuka ServiceHost. Sebagai contoh, lihat Pengikatan MSMQ Net.
Beberapa Kontrak dalam Antrean
Pesan dalam antrean dapat mengimplementasikan kontrak yang berbeda. Dalam hal ini, penting bahwa salah satu dari berikut ini benar untuk berhasil membaca dan memproses semua pesan:
Tentukan titik akhir untuk layanan yang mengimplementasikan semua kontrak. Ini adalah pendekatan yang direkomendasikan.
Tentukan beberapa titik akhir dengan kontrak yang berbeda, tetapi pastikan bahwa semua titik akhir menggunakan objek
NetMsmqBinding
yang sama. Logika pengiriman di ServiceModel menggunakan pompa pesan yang membaca pesan keluar dari saluran transportasi untuk pengiriman, yang akhirnya men-demultipleks pesan berdasarkan kontrak ke titik akhir yang berbeda. Sebuah pompa pesan dibuat untuk mendengarkan pasangan URI/Binding. Alamat antrean digunakan sebagai URI Dengarkan oleh pendengar yang antre. Membuat semua titik akhir menggunakan objek pengikatan yang sama akan memastikan bahwa satu pompa pesan digunakan untuk membaca pesan dan melakukan demultipleks ke titik akhir yang relevan berdasarkan kontrak.
Olahpesan SRMP
Seperti yang telah dibahas sebelumnya, Anda dapat menggunakan protokol SRMP untuk transfer antrean ke antrean. Cara ini biasanya digunakan ketika transport HTTP mentransmisikan pesan antara Antrean Transmisi dan Antrean Target.
Untuk menggunakan protokol transfer SRMP, alamatkan pesan menggunakan skema URI net.msmq, seperti yang disebutkan sebelumnya, dan tentukan pilihan SRMP atau SRMP Aman di QueueTransferProtocol
properti NetMsmqBinding
.
Menentukan properti QueueTransferProtocol
adalah fitur kirim-saja. Opsi ini merupakan indikasi oleh klien jenis protokol transfer antrean yang akan digunakan.
Menggunakan Active Directory
MSMQ hadir dengan dukungan untuk integrasi Active Directory. Ketika MSMQ diinstal dengan integrasi Active Directory, mesin harus menjadi bagian dari domain Windows. Active Directory digunakan untuk mempublikasikan antrean untuk penemuan; antrean tersebut disebut antrean publik. Saat mengalamati antrean, antrean dapat diselesaikan menggunakan Active Directory. Fitur ini mirip dengan cara Sistem Nama Domain (DNS) digunakan untuk menyelesaikan alamat IP dari nama jaringan. Properti UseActiveDirectory
di NetMsmqBinding
adalah Boolean yang menunjukkan apakah saluran antrean harus menggunakan Active Directory untuk menyelesaikan URI antrean. Secara default diatur menjadi false
. Jika properti UseActiveDirectory
diatur menjadi true
, saluran antrean menggunakan Active Directory untuk mengonversi net.msmq:// URI ke format nama.
Properti UseActiveDirectory
hanya bermakna untuk klien yang mengirim pesan karena digunakan untuk menyelesaikan alamat antrean saat mengirim pesan.
Memetakan URI net.msmq ke Nama Format Antrean Pesan
Saluran antre menangani pemetaan nama URI net.msmq yang diberikan ke saluran ke nama format MSMQ. Tabel berikut merangkum aturan yang digunakan untuk memetakan di antara keduanya.
Alamat antrean berbasis URI WCF | Gunakan properti Active Directory | Properti Protokol Transfer Antrean | Nama format MSMQ yang dihasilkan |
---|---|---|---|
Net.msmq://<machine-name>/private/abc |
False (default) | Native (default) | DIRECT=OS:machine-name\private$\abc |
Net.msmq://<machine-name>/private/abc |
Salah | SRMP | DIRECT=http://machine/msmq/private$/abc |
Net.msmq://<machine-name>/private/abc |
Benar | Asli | PUBLIC=some-guid (GUID antrean) |
Membaca Pesan dari Antrean Surat Mati atau Antrean Pesan Racun
Untuk membaca pesan dari antrean pesan-racun yang merupakan subantrean dari antrean target, buka ServiceHost
dengan alamat subantrean.
Contoh: Sebuah layanan yang membaca dari antrean pesan-racun dari antrean pribadi PurchaseOrders dari komputer lokal akan mengalamatkan net.msmq://localhost/private/PurchaseOrders;poison.
Untuk membaca pesan dari antrean surat mati transaksi sistem, URI harus dalam bentuk: net.msmq://localhost/system$;DeadXact.
Untuk membaca pesan dari antrean surat mati nontransaksional sistem, URI harus dalam bentuk: net.msmq://localhost/system$;DeadLetter.
Saat menggunakan antrean surat mati kustom, perhatikan bahwa antrean surat mati harus berada di komputer lokal. Dengan demikian, URI untuk antrean surat mati dibatasi pada formulir:
net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.
Layanan WCF memverifikasi bahwa semua pesan yang diterimanya ditujukan ke antrean tertentu yang sedang didengarkannya. Jika antrean tujuan pesan tidak cocok dengan antrean yang ditemukan, layanan tidak memproses pesan. Proses ini adalah masalah yang harus diatasi oleh layanan yang mendengarkan antrean surat mati karena pesan apa pun dalam antrean surat mati dimaksudkan untuk dikirim ke tempat lain. Untuk membaca pesan dari antrean surat mati, atau dari antrean racun, ServiceBehavior
dengan parameter Any harus digunakan. Sebagai contoh, baca Antrean Surat Gagal.
MsmqIntegrationBinding dan Mengalamati Layanan
MsmqIntegrationBinding
digunakan untuk komunikasi dengan aplikasi MSMQ tradisional. Untuk memudahkan interoperasi dengan aplikasi MSMQ yang ada, WCF hanya mendukung mengalamati nama format. Jadi, pesan yang dikirim menggunakan pengikatan ini harus sesuai dengan skema URI:
msmq.formatname:<MSMQ-format-name>>
MSMQ-format-name adalah dari bentuk yang ditentukan oleh MSMQ di Tentang Antrean Pesan.
Perhatikan bahwa Anda hanya dapat menggunakan nama format langsung, dan nama format publik dan pribadi (memerlukan integrasi Active Directory) saat menerima pesan dari antrean menggunakan MsmqIntegrationBinding
. Namun, disarankan agar Anda menggunakan nama format langsung. Misalnya, pada Windows Vista, menggunakan nama format lain menyebabkan kesalahan karena sistem mencoba membuka subantrean, yang hanya dapat dibuka dengan nama format langsung.
Saat mengalamati SRMP menggunakan MsmqIntegrationBinding
, tidak ada persyaratan untuk menambahkan /msmq/ dalam nama format langsung untuk membantu pengiriman Layanan Informasi Internet (IIS). Misalnya: Saat mengalamati antrean abc menggunakan protokol SRMP, daripada DIRECT=http://adatum.com/msmq/private$/abc
, Anda harus menggunakan DIRECT=http://adatum.com/private$/abc
.
Perhatikan bahwa Anda tidak dapat menggunakan upaya mengalamati net.msmq:// dengan MsmqIntegrationBinding
. Karena MsmqIntegrationBinding
mendukung upaya mengalamati nama format MSMQ bentuk bebas, Anda dapat menggunakan layanan WCF yang menggunakan pengikatan ini untuk menggunakan fitur daftar multicast dan distribusi di MSMQ. Satu pengecualian adalah menentukan CustomDeadLetterQueue
saat menggunakan MsmqIntegrationBinding
. Cara tersebut harus dalam bentuk net.msmq://, mirip dengan cara yang ditentukan menggunakan NetMsmqBinding
.