ServiceStack tidak memiliki perbedaan antara layanan yang dibuat untuk layanan MQ, REST, HTML atau SOAP, mereka adalah hal yang sama. yaitu mereka masing-masing menerima DTO Permintaan dan secara opsional mengembalikan DTO Respons dan layanan yang sama dapat menangani panggilan dari titik akhir atau format apa pun, misalnya HTML, REST, SOAP, atau MQ.
Lihat diagram Arsitektur ServiceStack untuk melihat bagaimana MQ cocok.
Batasan
Satu-satunya hal yang perlu Anda ingat adalah:
- Seperti SOAP, MQ hanya mendukung 1 Verb sehingga metode Anda perlu diberi nama Post atau Apa saja
- Hanya Filter Tindakan yang dijalankan (yaitu, bukan filter Global atau Atribut)
- Anda mendapatkan stub MqRequest dan MqResponse sebagai pengganti
IHttpRequest
,IHttpResponse
. Anda masih dapat menggunakan.Items
untuk meneruskan data melalui jalur permintaan tetapi tindakan HTTP apa pun seperti menyetel cookie atau Header HTTP tidak berbahaya
Mengonfigurasi Redis MQ Host
Host MQ itu sendiri benar-benar dipisahkan dari kerangka ServiceStack lainnya, yang tidak mengetahui keberadaan MQ sampai Anda mengirimkan pesan ke ServiceStack sendiri, yang biasanya dilakukan di dalam handler terdaftar Anda, mis:
var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount:2);
mqHost.RegisterHandler<Hello>(m => {
return this.ServiceController.ExecuteMessage(m);
});
//shorter version:
//mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);
mqHost.Start(); //Starts listening for messages
Di RegisterHandler<T>
. Anda Anda menentukan jenis Permintaan yang ingin Anda dengarkan.
Secara default, Anda hanya dapat Mendaftarkan satu penangan untuk setiap pesan dan di ServiceStack, Permintaan terkait dengan implementasi Layanan yang diketahui, dalam kasus MQ, ia mencari tanda tangan metode yang pertama kali cocok:Post(Hello)
dan jika itu tidak ada, carilah Any(Hello)
fall penggantinya .
Dapat menambahkan sendiri beberapa penangan per pesan
Jika Anda ingin memanggil beberapa penangan maka Anda hanya perlu mempertahankan List<Handler>
Anda sendiri dan lakukan saja dan jalankan semuanya saat ada permintaan masuk.
Memanggil layanan yang berbeda
Jika Anda ingin memanggil layanan yang berbeda, cukup terjemahkan ke DTO Permintaan yang berbeda dan teruskan ke ServiceController.
Saat Permintaan MQ dikirim oleh siapa pun, mis:
mqClient.Publish(new Hello { Name = "Client" });
Handler Anda dipanggil dengan instance tipe IMessage di mana Request DTO terdapat di Body Properti. Kemudian Anda dapat memilih untuk membuang pesan, memvalidasinya, atau mengubahnya.
Permintaan MQ sama dengan permintaan Layanan lainnya
Dalam kebanyakan kasus, Anda biasanya hanya meneruskan pesan ke ServiceController untuk diproses, yang implementasinya adalah:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Implementasi hanya mengekstrak DTO Permintaan dari mqMsg.Body dan memproses pesan tersebut sebagai layanan normal yang diteruskan C# Request DTO sejak saat itu, dengan MqRequestContext yang berisi rintisan MQ IHttpRequest, IHttpResponse.