RabbitMQ消费者作为Windows服务

san*_*ndy 2 .net windows-services rabbitmq mongodb-.net-driver

我有一个rabbitmq消费者应用程序在.net中实现"发布/订阅模式",它完美地作为控制台应用程序运行,但当我将其部署为Windows服务时,似乎并没有将数据保存到mongodb中.

    protected override void OnStart(string[] args)
    {
        try
        {
             var connectionString = "mongodb://localhost";
            var client = new MongoClient(connectionString);
            var factory = new ConnectionFactory() { HostName = "localhost" };            
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.ExchangeDeclare(exchange: "test", type: "fanout");
                    var queueName = channel.QueueDeclare().QueueName;
                    channel.QueueBind(queue: queueName,                                       exchange: "logs", routingKey: "");

                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                    {
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                        BsonDocument document = BsonDocument.Parse(message);
                        var database = client.GetDatabase("test");
                        var collection = database.GetCollection<BsonDocument>("test_collection");
                        collection.InsertOneAsync(document);
                    };
                    channel.BasicConsume(queue: queueName,                                       noAck: true,consumer: consumer);

                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
Run Code Online (Sandbox Code Playgroud)

有什么东西我不见了吗?

Sve*_*lov 11

在OnStart()中忙碌等待是一个坏主意,因为操作系统将期望从它返回.在这里阅读:https://msdn.microsoft.com/en-us/library/zt39148a%28v=vs.110%29.aspx

编辑:上面代码的问题是你在using语句中有你的连接和通道.这样做的关键是将它们置于范围之外.所以在这种情况下,即使你要添加一个事件处理程序,在退出范围和处理通道之后不久,等等.要解决这个问题,请将连接,通道和消费者从"OnStart"方法中拉出来并使他们成为班级(可能是私人)成员.即使退出方法并且您的事件应该继续收听,这应该保持打开状态.