我正在使用 MassTransit 并在我的应用程序中有以下代码:
RequestMsg request = buildMeARequest();
SomeTypeOfResponse response = null;
_serviceBus.PublishRequest(request, c =>
{
c.Handle<SomeTypeOfResponse>(message => response = message);
c.SetTimeout(TimeSpan.FromSeconds(30));
});
return response;
在消费者方面,我有这样的事情:
public class RequestMsgConsumer : Consumes<T>.All
{
public RequestMsgConsumer(IServiceBus serviceBus)
{
_serviceBus = serviceBus;
}
public void Consume(RequestMsg request)
{
SomeTypeOfResponse response = doWorkToGetResponse(request);
_serviceBus.Context().Publish(response);
}
}
当一切顺利时,这很有效......但是,如果doWorkToGetResponse(request)
抛出异常(或Consume()
方法的任何部分)原始请求者超时,则没有失败的迹象。
我最初的想法是构建一个类Either<Exception, SomeTypeOfResponse>
,这样请求者总是期望这个Either<>
构造,但这将迫使我总是尝试/捕获每个消耗方法——而且它们有很多。
有没有其他人更优雅地解决了这个问题?