我有一个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语句中具有连接和通道。这样做的全部目的是一次性将它们处理掉。因此,在这种情况下,即使要添加事件处理程序,也要在退出范围并处置通道等之后不久。要解决此问题,请从OnStart方法中拉出连接,通道和使用者并使其成为 class 成员(可能是私有(private)成员)。即使退出方法,事件也应保持打开状态,并且事件应继续监听。