与TopShelf一起用作Windows服务时,RabbitMQ不接收消息

开发工程师

我正在尝试将RabbitMQ微服务转换为Windows服务。我已使用TopShelf进行转换。我的RabbitMQ微服务本身可以完美运行,但是当我将其作为服务运行时,它不再接收消息。在我的public static void Main(string[] args)我有:

 HostFactory.Run(host =>
                {
                    host.Service<PersonService>(s =>                      
                    {
                        s.ConstructUsing(name => new PersonService());
                        s.WhenStarted(tc => tc.Start());             
                        s.WhenStopped(tc => tc.Stop());               
                    });
                    host.SetDescription("Windows service that provides database access totables."); 
                    host.SetDisplayName("Service");                   
                    host.SetServiceName("Service");
                });
            }

那我PersonService上课的时候

public void Start() {
            ConsumeMessage();
        }

最后是我的ConsumeMessage功能:

private static void ConsumeMessage() {
        MessagingConfig.SetInstance(new MessagingConstants());
        IMessageFactory pmfInst = MessageFactory.Instance;

        //message worker
        var factory = new ConnectionFactory() {
            HostName = MessagingConfig.Instance.GetBrokerHostName(),
            UserName = MessagingConfig.Instance.GetBrokerUserName(),
            Password = MessagingConfig.Instance.GetBrokerPassword()
        };

        var connection = factory.CreateConnection();

        using (var channel = connection.CreateModel()) {
            channel.QueueDeclare(queue: MessagingConfig.Instance.GetServiceQueueName(),
                                 durable: true,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            channel.BasicQos(0, 1, false);

            var consumer = new EventingBasicConsumer(channel);

            channel.BasicConsume(queue: MessagingConfig.Instance.GetServiceQueueName(),
                                 noAck: false,
                                 consumer: consumer);

            Console.WriteLine("Service.");
            Console.WriteLine(" [x] Awaiting RPC requests");


            // Code Below Is Not Executed In Service
            consumer.Received += (model, ea) => {

                string response = null;

                var body = ea.Body;
                var props = ea.BasicProperties;
                var replyProps = channel.CreateBasicProperties();
                replyProps.CorrelationId = props.CorrelationId;

                string receivedMessage = null;

                try {
                    receivedMessage = Encoding.UTF8.GetString(body);
                    response = ProcessMessage(receivedMessage);
                }
                catch (Exception e) {
                    // Received message is not valid.
                    WinLogger.Log.Error(
                        "Errror Processing Message: " + receivedMessage + " :" + e.Message);

                    response = "";
                }
                finally {

                    var responseBytes = Encoding.UTF8.GetBytes(response);
                    channel.BasicPublish(exchange: "", routingKey: props.ReplyTo,
                    basicProperties: replyProps, body: responseBytes);
                    channel.BasicAck(deliveryTag: ea.DeliveryTag,
                    multiple: false);
                }
            };
            Console.ReadLine();
        }

纵观类似的SO问题,看起来它是与Windows服务是想回报,但我不知道怎么叫ConsumeMessage这么consumer.Received += (model, ea) => {...};执行。

编辑:看来我的阻止机制Console.ReadLine();已被服务忽略,因此它继续运行并处理消息使用者。那么,如何阻止在那里接收消息?

亚历克斯·布尼(Alex Buyny)

您的代码使用了using构造,这意味着当您的OnStart方法返回时,您channel实际上将被处置。文件建议做你的初始化OnStart,所以创建channelconsumer存在,但不使用using

this.connection = factory.CreateConnection();

this.channel = connection.CreateModel();
this.consumer = new EventingBasicConsumer(this.channel);

然后,这些对象将在OnStart方法完成后继续存在您应该在OnStop方法中处理它们

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

与 RabbitMQ 一起使用时,Flask-SocketIO 不接收来自前端的消息

将多个类一起用作哈希键

Vagrant:是否可以在不付费的情况下将Vagrant与VMWare一起用作提供程序?

Bash:将函数与管道一起用作另一个函数的参数

webkit css resize不能与画布一起用作子级?

将function.call与该参数一起用作函数参数

与Angular 4 AoT一起用作useValue提供程序时,窗口未定义

如何将Latexmk与MuPDF一起用作PDF预览器?

将CURL与TOR一起用作CentO上的代理

如何确保==将始终与原语一起用作相等性测试

如何加载与LWJGL一起用作openGL纹理的图像?

为什么组合器“之间”不能与“选择”一起用作解析器?

Xdebug无法与主管一起用作后台运行器

R:将mapply与其他列表一起用作参数

将Objective-C JSONModel与对象数组一起用作入口点

将read_csv与自制对象一起用作“文件”

将弹性包装与拉伸元素一起用作行

对于html canvas,如何将clip()与文本一起用作路径?

是否可以将np.array()与列表一起用作输入?

qsort()函数可以与函数模板一起用作比较器吗?

是否有将jsViews / jsRender与Web组件一起用作模板引擎的用例?

将SVG与参考的PNG一起用作背景图像

我想将findViewById与字符串一起用作ID

与 SendGrid 一起用作输出绑定时,Azure 函数中的错误处理

将 Scrapy 与 Google Cloud Storage 一起用作 Feed 导出的问题

如何將 SUMIF 與條件一起用作字符串中的文本

将Azure AD与Identity Core(ASP.NET Core 2.1)一起用作外部登录时无法获得用户组声明

将Retrofit2与recyclerview一起用于嵌套JSON,响应不兼容

与socat一起发送消息并接收响应