ServiceStack không có sự phân biệt giữa các dịch vụ được tạo cho các dịch vụ MQ, REST, HTML hoặc SOAP, chúng giống nhau. tức là mỗi bên chấp nhận một DTO yêu cầu và tùy chọn trả lại một DTO phản hồi và cùng một dịch vụ có thể xử lý các cuộc gọi từ bất kỳ điểm cuối hoặc định dạng nào, ví dụ:HTML, REST, SOAP hoặc MQ.
Tham khảo sơ đồ Kiến trúc của ServiceStack để xem MQ phù hợp như thế nào.
Hạn chế
Điều duy nhất bạn cần ghi nhớ là:
- Giống như SOAP, MQ chỉ hỗ trợ 1 Động từ nên các phương pháp của bạn cần được đặt tên là Đăng hoặc Bất kỳ
- Chỉ các Bộ lọc hành động mới được thực thi (tức là không phải bộ lọc Toàn cầu hoặc Bộ lọc thuộc tính)
- Bạn nhận được các bản khai MqRequest và MqResponse thay cho
IHttpRequest
,IHttpResponse
. Bạn vẫn có thể sử dụng.Items
để chuyển dữ liệu qua đường dẫn yêu cầu nhưng bất kỳ hành động HTTP nào như đặt cookie hoặc Tiêu đề HTTP đều không tốt
Định cấu hình Máy chủ Redis MQ
Bản thân MQ Host được tách biệt hoàn toàn khỏi phần còn lại của khung ServiceStack, người không biết MQ tồn tại cho đến khi bạn tự mình chuyển thông báo vào ServiceStack, điều này thường được thực hiện bên trong trình xử lý đã đăng ký của bạn, ví dụ:
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
Trong RegisterHandler<T>
của bạn bạn chỉ định loại Yêu cầu mà bạn muốn nó lắng nghe.
Theo mặc định, bạn chỉ có thể Đăng ký một trình xử lý duy nhất cho mỗi thư và trong ServiceStack, một Yêu cầu được gắn với một triển khai Dịch vụ đã biết, trong trường hợp của MQ, nó đang tìm kiếm một chữ ký phương thức phù hợp đầu tiên:Post(Hello)
và nếu điều đó không tồn tại, nó sẽ tìm kiếm dự phòng Any(Hello)
.
Có thể tự thêm nhiều trình xử lý cho mỗi thư
Nếu bạn muốn gọi nhiều trình xử lý thì bạn chỉ cần duy trì List<Handler>
của riêng mình và chỉ cần duyệt qua và thực hiện tất cả chúng khi có yêu cầu.
Gọi các dịch vụ khác nhau
Nếu bạn muốn gọi một dịch vụ khác, chỉ cần dịch nó sang Yêu cầu DTO khác và chuyển nó đến ServiceController thay thế.
Khi một Yêu cầu MQ được gửi bởi bất kỳ ai, ví dụ:
mqClient.Publish(new Hello { Name = "Client" });
Trình xử lý của bạn được gọi với một phiên bản của loại IMessage trong đó Yêu cầu DTO được chứa trong Phần thân bất động sản. Tại thời điểm đó, bạn có thể chọn loại bỏ tin nhắn, xác thực hoặc thay đổi nó.
Yêu cầu MQ giống với bất kỳ yêu cầu Dịch vụ nào khác
Trong hầu hết các trường hợp, bạn thường chỉ chuyển tiếp thông báo đến ServiceController để xử lý, việc triển khai là:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Việc triển khai chỉ trích xuất Yêu cầu DTO từ mqMsg.Body và xử lý thông báo đó như một dịch vụ bình thường được chuyển qua C # Request DTO từ thời điểm đó, với MqRequestContext có chứa các sơ khai MQ IHttpRequest, IHttpResponse.