调用wcf方法时通知Rabbitmq队列订阅者

时间:2018-09-16 23:24:57

标签: c# wcf rabbitmq messagebroker

我们有一个Windows服务,该服务托管 WCF接口 (ServiceHost)。此服务提供一种方法AddProduct。现在,如果没有错误或其他不可预见的事情发生,则应该通过 RabbitMq (Pub / Sub)传递一条消息,告知已添加新产品。然后其他服务应使用此消息并自行处理。

我在 RabbitMq 世界中还很陌生,所以问题是,鉴于此功能应该在同一服务中运行,最好的方法是什么?

是否有任何框架? RabbitMq 是否适合此操作,还是建议使用其他Message Broker?

1 个答案:

答案 0 :(得分:1)

RabbitMQ有一个引人入胜的.net包装器,称为EasyNetQ,适用于服务之间的通知和其他通信,请参阅Jeffrey Richter视频-123 。通过消息队列进行通信可以使服务保持独立,并且彼此之间不了解情况。为此,请参见带有EasyNetQ的quickstart和publish \ subscribe模式。它应该适合您上面的任务。这是一个如何通过简单的类型化的发布-订阅方法来通知有关新项目的服务的示例:

// somewhere in your WCF service
if (isProductAddedSuccessfully)
{
    using (var bus = RabbitHutch.CreateBus("host=your-rabbitmq-node"))
    {
        bus.Publish(new NewProductMessage
        {
            Id = product.Id,
            Amount = 1,
            Added = DateTime.Now
        });
    }
}

以及您的一些服务:

public class Service : IDisposable
{
    private IBus _bus;

    public void Initialize()
    {
        _bus = RabbitHutch.CreateBus("host=your-rabbitmq-node");
        _bus.Subscribe<NewProductMessage>("test", HandleNewProduct);
    }

    void HandleNewProduct(NewProductMessage newProduct)
    {
        SendUserNotifiaction(newProduct);
        ProcessProductOrder(newProduct);
    }

    // Some service logic here...
    // SendUserNotifiaction
    // ProcessProductOrder

    public void Dispose()
    {
        _bus?.Dispose();
    }
}

您看到,所有订阅了NewProductMessage类型消息的服务在WCF服务中发布后都将收到相同的消息。相应的命名队列将自动出现在RabbitMq中。注意,RabbitMQ上的EasyNetQ支持还发送\接收和请求\响应通信模式,这在服务体系结构中可能很有用。