2

我正在使用 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<>构造,但这将迫使我总是尝试/捕获每个消耗方法——而且它们有很多。

有没有其他人更优雅地解决了这个问题?

4

1 回答 1

2

我相信你想要的是添加c.HandleFault(fault => ...)到你的PublishRequest.

如果这不起作用,在过去一两周的邮件列表中有几条关于下一个版本将如何修复的消息。我认为失败仅限于 Sagas,但我可能是错的。

于 2013-08-13T00:33:18.443 回答