将EasynetQ订户转变为可观察的

时间:2018-03-14 17:53:19

标签: c# rabbitmq reactive-programming system.reactive easynetq

使用RabbitMQ时,我使用EasyNetQ作为客户端库。要创建订阅者,请执行

bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));

当MyMessage的一个实例发布时,EasyNetQ将调用该委托并将消息的Text属性打印到控制台。

如何将其转换为可观察的序列?我一直在研究Observable.CreateObservable.Generate方法,但我无法弄清楚如何桥接RabbitMQ使用者和可观察的序列。

Subscribe方法返回IDisposable,因此解决方案应该尊重这一点,以便可以正确处理资源。

我注意到了solution,但大多数人似乎建议不要使用Subject,所以我想找到另一种解决方案。

欢迎任何提示或想法。

1 个答案:

答案 0 :(得分:1)

这有用吗?

var observable = Observable.Create<MyMessage>(o => 
    bus.Subscribe<MyMessage>("my_subscription_id", msg => o.OnNext(msg))
);

我对引用代码中使用Subject的方式没有问题:如果Subject是私有(理想上只读)字段,则只显示为{{1}然后它的影响被包含起来。但是,该引用链接的代码存在其他问题:

  • 如果有多个IObservable来电,则会有多个订阅,其中只有一个会被处理掉。这可能会导致泄密(不知道EasyNetQ订阅的实施方式)。

  • 最好不要实施.Connect()(或IObservable),因为上述情况很容易出错。