使用RabbitMQ时,我使用EasyNetQ作为客户端库。要创建订阅者,请执行
bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));
当MyMessage的一个实例发布时,EasyNetQ将调用该委托并将消息的Text属性打印到控制台。
如何将其转换为可观察的序列?我一直在研究Observable.Create
和Observable.Generate
方法,但我无法弄清楚如何桥接RabbitMQ使用者和可观察的序列。
Subscribe
方法返回IDisposable
,因此解决方案应该尊重这一点,以便可以正确处理资源。
我注意到了solution,但大多数人似乎建议不要使用Subject
,所以我想找到另一种解决方案。
欢迎任何提示或想法。
答案 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
),因为上述情况很容易出错。