.net - RabbitMQ 消费者作为 Windows 服务

标签 .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;
        }
    }

有什么我想念的吗?

最佳答案

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

编辑:上面代码的问题是您在 using 语句中有连接和 channel 。这样做的全部意义在于一旦超出范围就将它们处理掉。因此,在这种情况下,即使您正在添加一个事件处理程序,您也会在退出范围并处理 channel 等之后不久。要解决此问题,请将连接、 channel 和使用者从“OnStart”方法中拉出并使它们成为类(可能是私有(private)的)成员。即使您退出该方法并且您的事件应该继续收听,这也应该让它们保持打开状态。

关于.net - RabbitMQ 消费者作为 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702564/

相关文章:

Docker 容器未启动,因为 rabbit 磁盘空间不足

.net - 如何在客户端 .NET 应用程序中使用 WCF 数据服务操作?

c# - 无法安装简单 Windows 服务 - 登录?

.net - 实现 DUKPT key 管理

C#程序远程登录并修改服务密码

c# - AppFabric 托管/管理替换

python - 饥饿的 Python worker 的内存泄漏

ubuntu - 在 Ubuntu Xenial (Ubuntu 16.04) 上安装 RabbitMQ 的简单方法

.net - XML 文件中日期/时间的正确格式是什么

c# - 如何使用 HttpClient 确定是否从缓存中完成了 HttpResponseMessage