首页 新闻 会员 周边

rabbitmq消费者做成系统服务,如果保持监听事件?

0
[已解决问题] 解决于 2016-09-27 17:35

我在把消费者做成系统服务时,出现了一个问题,就是代码不执行。

 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() 保持持续监听事件,但是做成系统服务之后,这个就无效了

SeeThrough的主页 SeeThrough | 初学一级 | 园豆:189
提问于:2016-09-18 10:32
< >
分享
最佳答案
0

要点:

1.consumer.Received是非阻塞的

2.服务中Console.ReadLine();不会起作用

 

原因分析:原有控制台中执行到Console.ReadLine()会发生阻塞,保持consumer不被释放;现在改成服务后,由于Console.ReadLine()不起作用,会继续向下执行,导致你的consumer被释放,当然就无效了。

奖励园豆:5
朝雨 | 菜鸟二级 |园豆:272 | 2016-09-18 18:04
其他回答(3)
0

建一个windows服务项目就行.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-18 10:51

我现在已经做成系统服务了,但是不行

支持(0) 反对(0) SeeThrough | 园豆:189 (初学一级) | 2016-09-18 11:02

@SeeThrough: 你consumer定义成静态的就好了.放到外面去.你这样main结束就被释放.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-18 11:11

@吴瑞祥: var consumer = new EventingBasicConsumer(channel); 是这个consumer吗?

支持(0) 反对(0) 日月草方 | 园豆:200 (初学一级) | 2017-01-10 18:27

@日月草方: 这个是我们公司之前用的.你可以看看

https://github.com/wrx362114/EasyMQService

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-01-10 22:10
0

同遇到这个问题,麻烦请教下最后是怎么解决的呢?

最美的不是下雨天 | 园豆:4 (初学一级) | 2017-08-25 10:24
1

不用using 就ok的啦

Mr_Song | 园豆:202 (菜鸟二级) | 2020-04-08 16:22

这个可以,感谢

支持(0) 反对(0) 咖啡昂vs咖啡猫 | 园豆:200 (初学一级) | 2021-08-19 09:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册