我在把消费者做成系统服务时,出现了一个问题,就是代码不执行。
using (var connection = _factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: exchangeName, type: "direct", durable: true); string queue = string.Empty; //如果不显示声明队列,则每个消费者都会创建一个新的队列 if (string.IsNullOrEmpty(queueName)) { queue = channel.QueueDeclare().QueueName; } else { queue = queueName; } channel.QueueBind(queue: queue, exchange: exchangeName, routingKey: routingKey); //每次处理单个Message channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); var consumer = new EventingBasicConsumer(channel); channel.BasicConsume(queue: queue, noAck: false, consumer: consumer);//返回通知才删除队列 consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); T obj = JsonConvert.DeserializeObject<T>(message); handle(obj); channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);//返回通知删除 }; Console.ReadLine(); }
如上代码,控制台程序可以用 console.readLine() 保持持续监听事件,但是做成系统服务之后,这个就无效了
要点:
1.consumer.Received是非阻塞的
2.服务中Console.ReadLine();不会起作用
原因分析:原有控制台中执行到Console.ReadLine()会发生阻塞,保持consumer不被释放;现在改成服务后,由于Console.ReadLine()不起作用,会继续向下执行,导致你的consumer被释放,当然就无效了。
建一个windows服务项目就行.
我现在已经做成系统服务了,但是不行
@SeeThrough: 你consumer定义成静态的就好了.放到外面去.你这样main结束就被释放.
@吴瑞祥: var consumer = new EventingBasicConsumer(channel); 是这个consumer吗?
@日月草方: 这个是我们公司之前用的.你可以看看
https://github.com/wrx362114/EasyMQService
同遇到这个问题,麻烦请教下最后是怎么解决的呢?
不用using 就ok的啦
这个可以,感谢