1

我目前正在使用rabbitMQ服务器,当我尝试在c#控制台应用程序中工作时,发布交换工作并成功保存在服务器中,消息将生动地出现在控制台中但是当我在C# windows窗体中应用我的源代码时,它不会得到发布者发送的所有消息。我将该方法放在构造函数事件中,但根本没有发生,它不会收到任何消息。

请看下面的源代码

using Publisher;
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;
using RabbitMQ.Client.Events;
using System.Diagnostics;

namespace Consumer
{
    public partial class Consumer : Form
    {

        private EventingBasicConsumer consumer;
        ConnectionFactory factory;
        public Consumer()
        {
            factory = new ConnectionFactory() { HostName = Definition.HOSTNAME };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.ExchangeDeclare(exchange: Definition.EXCHANGE, type: ExchangeType.Fanout);

                var queueName = channel.QueueDeclare().QueueName;
                channel.QueueBind(queue: queueName,
                                  exchange: Definition.EXCHANGE,
                                  routingKey: "");




                Debug.WriteLine(" [*] Waiting for Exchange ARexchange.");
                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (sender, ea) =>
                {
                   var body = ea.Body;
                   var message = Encoding.UTF8.GetString(body);
                   Debug.WriteLine(" [x] {0}", message);
                 };
                channel.BasicConsume(
                                queueName,
                                 autoAck: false,
                                 consumer: consumer);
            }

            InitializeComponent();


        }

        private void Consumer_Load(object sender, EventArgs e)
        {

        }
        private void setExchange()
        {
            lblExchange.Text = Definition.EXCHANGE;
        }

    }
}
4

1 回答 1

1

请阅读:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())

当这些using语句退出时,通道和连接将被关闭。更改代码以将它们保存为Consumer类中的实例变量。然后,当您的表单退出时,您可以清理这两个实例。

如果您在可以克隆、编译和运行的存储库中提供代码,人们可以通过提交拉取请求来帮助您改进代码。


注意: RabbitMQ 团队会监控rabbitmq-users 邮件列表,有时只会在 StackOverflow 上回答问题。

于 2019-11-26T19:46:46.540 回答