包装到另一个类中时,IBusControl Publish不执行任何操作

时间:2017-08-08 12:48:22

标签: c# rabbitmq masstransit

我在与MassTransit挣扎,这是另一个我未能解决的棘手问题。 当我直接调用Publish方法时,一切正常并且消息被发送到RMQ。但是当我用自己的方法包装这个方法并在包装类中注入总线时#39;构造函数,它不起作用。消息根本无法到达总线。

using (var uow = new Wrapper(ctx, bus))
{
    var itemMsg = new ItemChangedMessage() { Value = item.Value };

    uow.Publish(itemMsg); //Does not work

    bus.Publish(itemMsg); //Works fine
}

这是一个包装类'方法。没什么特别的。

public void Publish(IMessage message)
{
    bus.Publish(message);
    ...
}

我绝对不知道这里会出现什么样的问题。尝试使用async \ await的不同组合,但没有任何帮助。

2 个答案:

答案 0 :(得分:2)

我认为你的包装器在调用完成之前就已经处理好,因为你还没有等待发布。您必须执行async / await,或者您可以在包装器中使用TaskUtil.Await(() => bus.Publish(message));

这应该有效:

using (var uow = new Wrapper(ctx, bus))
{
    var itemMsg = new ItemChangedMessage() { Value = item.Value };

    await uow.Publish(itemMsg);
}

...

public async Task Publish(object message)
{
    await bus.Publish(message);
    ...
}

但主要问题确实是别的。正如在另一个答案中正确指出的那样,您使用的是类型重载Publish<T>(T message),但您的TIMessage,因此MassTransit会将其发布到IMessage交换,因为您最有可能订阅ItemChangedMessage,您的消费者永远不会得到它。

查看调试日志时可以很容易地看到这一点:

  

[15:51:06 DBG] Exchange:BusWrapper:IMessage(持久)

     

[15:51:06 DBG]发送rabbitmq:// localhost / BusWrapper:IMessage 1b340000-da2d-1866-1043-08d4de648414 BusWrapper.IMessage

您无需使用任何界面标记消息,只会创建不必要的交换和依赖关系,您是否希望将消息接口共享为库。根据此答案中的更新代码,您可以使用public async Task Publish(object message)。{/ p>

或者,您可以使用Publish(object message)重载,它会为您找到类型并正确发布。在这种情况下,您需要在包装器中使用它:

public async Task Publish(IMessage message)
{
    await bus.Publish((object) message);
    ...
}

答案 1 :(得分:1)

我认为Publish是通用的,并且您的方法中使用了不同的重载。将您的方法签名更改为:

public void Publish<T>(T message) where T : IMessage