Tôi có một tình huống sau đây:NServiceBus - Cách nhận hàng đợi riêng cho mỗi người nhận loại tin nhắn đăng ký?
Vì vậy, nhận đặt mua hai loại sự kiện: eventA và eventB. NServiceBus tạo hàng đợi cho người nhận (người nhận) và các thông điệp địa điểm của loại eventA và eventB đến cùng một hàng đợi. Câu hỏi là, nếu tôi có thể cấu hình NServiceBus để sử dụng hàng đợi riêng biệt (ReceiveEventA và ReceiverEventB) cho mỗi loại sự kiện cho người nhận? Hoặc tôi có thể có hai người nhận trong một quá trình (và mỗi người nhận hàng đợi riêng biệt). Điều là EventA mất nhiều thời gian để xử lý hơn EventB và chúng độc lập - vì vậy nếu chúng nằm trong hàng đợi riêng biệt, chúng có thể được xử lý đồng thời.
Cập nhật: Nếu tôi đi với cách tiếp cận ngây thơ như thế này, nhận thất bại trong việc bắt đầu với tài liệu tham khảo ngoại lệ null:
private static IBus GetBus<THandler, TEvent>()
{
var bus = Configure.With(new List<Type>
{
typeof(THandler),
typeof(TEvent),
typeof(CompletionMessage)
})
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
.LoadMessageHandlers()
.ImpersonateSender(false);
bus.Configurer.ConfigureProperty<MsmqTransport>(x => x.InputQueue, "Queue" + typeof(THandler).Name);
return bus.CreateBus().Start();
}
[STAThread]
static void Main()
{
Busses = new List<IBus>
{
GetBus<ItemEventHandlerA, ItemEventA>(),
GetBus<ItemEventHandlerB, ItemEventB>()
};
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm());
}
ngoại lệ stack trace là:
tại NServiceBusTest2.WinFormsReceiver.Program .GetBusTHandler, TEvent trong C: \ Users \ User \ Documents \ Visual Studio 2010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: dòng 57
tại NServiceBusTest2.WinFormsReceiver.Program.Main() trong C: \ Users \ Người dùng \ Documents \ Visual Studio 2 010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: dòng 26
tại System.AppDomain._nExecuteAssembly (lắp ráp RuntimeAssembly, String [] args)
tại System.AppDomain.ExecuteAssembly (String assemblyFile, Bằng chứng assemblySecurity, String [ ] args) tại Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
tại System.Threading.ThreadHelper.ThreadStart_Context (bang Object)
tại System.Threading.ExecutionContext.Run (executionContext executionContext, ContextCallback gọi lại, đối tượng nhà nước, Boolean ignoreSyncCtx)
tại System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object state)
tại System.Threading.ThreadHelper.ThreadStart()
Tôi đã suy nghĩ về ném đến ThreadPool như mục công việc, nhưng nếu nó không có? Xử lý sẽ được hoàn thành công việc của nó, do đó, tin nhắn sẽ được loại bỏ khỏi hàng đợi và không có cách nào tiêu chuẩn để có được nó trở lại đó (hoặc tôi thiếu một cái gì đó?). Chúng tôi đang sử dụng các hình thức cửa sổ như một công cụ quản lý quy trình - Tôi đã đề cập đến ví dụ cụ thể hơn ở đây: https://github.com/NServiceBus/NServiceBus/issues/219 – Giedrius
@Giedrius: Cung cấp thông tin cập nhật trong phần nội dung câu trả lời. –
Cảm ơn sự giúp đỡ của bạn. Để trả lời câu hỏi của bạn - WinForms là để có một bảng điều khiển để tạm dừng/tiếp tục, cũng để xem tình trạng hiện tại của kênh bán hàng - đó là những gì xử lý. Chúng tôi tìm thấy một cách để có một số người nhận bằng cách sử dụng AppDomain riêng biệt, nhưng nói chung đó là cách giải quyết đau đớn. Có vẻ như chúng tôi sẽ phải chấp nhận giải pháp thay thế cho AppDomains, hoặc tìm kiếm thay thế cho NServiceBus, hoặc suy nghĩ lại triển khai (bây giờ chúng tôi có cc.net + clickOnce) và có bảng điều khiển và trình xử lý được đặt thành các phần riêng biệt. – Giedrius