2017-08-08 54 views
0

我正在努力与MassTransit,这是另一个棘手的问题,我还没有解决。 当我直接调用发布方法时,一切正常,邮件发送到RMQ。但是当我用自己的方法封装这个方法并且在包装类的构造函数中注入总线时,它不起作用。消息根本就没有到达公共汽车。IBusControl发布什么都不做,同时包装到另一个类

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); 
    ... 
} 

我完全不知道这里可能会出现什么样的问题。尝试了异步\ await不同的组合,但没有任何帮助。

回答

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]外汇:BusWrapper:即时聊天(耐久)

[15时51分06秒DBG] SEND RabbitMQ的://本地主机/ BusWrapper:即时聊天1b340000-da2d-1866-1043-08d4de648414 BusWrapper.IMessage

您不必与任何接口您的邮件标记,它只能造成不必要的交流和依赖性,你会想将你的消息接口作为一个lib来共享郭宝宏。根据此答案中的更新代码,您可以很好地使用public async Task Publish(object message)

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

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

已经尝试了TaskUtil.Await(()=> _bus.Publish(message));同样,但它没有帮助。 –

+0

好的,我知道它是什么 –

+0

@AlexeyKoptyaev更新了我的答案。我被这几次烧伤了。 –

1

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

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

有没有需要有一个接口 –

+0

@AlexeyZimarev可能,我不知道是什么发布预计,但我离开那里,以保持一致与OP代码 – MistyK

+0

@MistyK Nope,它是相同的重载,因为ItemChangedMessage实现IMessage –