我在与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的不同组合,但没有任何帮助。
答案 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)
,但您的T
是IMessage
,因此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