我正在尝试使用通用主机Windows服务的处理函数的同步发送/回复,如下所示。但我认为NServiceBus只在完成句柄功能后才会发送消息(在当前事务完成期间)。所以下面的代码将挂起'synchronousHandle.AsyncWaitHandle.WaitOne()'。
这里最好的方法是什么?你能指导我......
Handler constructer
ConstructorFunction(bus)
{
Bus = bus
}
code in the handle function.
// sent the message to the bus and wait for the reply
IMessage response = null;
var synchronousHandle = Bus.Send(service2queue, requestMessage)
.Register(
(AsyncCallback)delegate(IAsyncResult asyncResult)
{
// Callback block for reply message
// Reply message received
NServiceBus.CompletionResult completionResult = asyncResult.AsyncState as NServiceBus.CompletionResult;
if (completionResult != null && completionResult.Messages.Length > 0)
{
// Always expecting one IMessage as reply
response = completionResult.Messages[0];
}
},
null);
// block the current thread till the reply received.
synchronousHandle.AsyncWaitHandle.WaitOne();
谢谢, Ajai
答案 0 :(得分:5)
nservicebus试图在不应该做的时候尽可能地努力。
:
Bus.Send(request).Register(asyncCallback, state)
Callback only fires on first response, then is cleaned up to prevent memory leaks.
Doesn’t survive restarts – not suitable for server-side
假设您在服务器端(我猜这里是因为您向我们展示了一个消息处理程序),我会考虑重新设计。
service1 gets a notification about messageA
service1 sends message requestMessage to service2
service2 replies with message responseMessage to service1
service1 handles responseMessage and continues processing
如果您想在继续处理之前等待service1中的多条消息,请尝试考虑实施传真。