• WinForm实现Rabbitmq官网6个案例-Routing


    代码:

    namespace RabbitMQDemo
    {
        public partial class Routing : Form
        {
            private string exchangeName = "direct_logs";
            private string exchangeType = ExchangeType.Direct;//垂直交换机
            private readonly static Routing _Routing;
            Action<string, TextBox> SetText;
            static Routing()
            {
                _Routing = new Routing();
            }
            /// <summary>
            /// 单例模式
            /// </summary>
            public static Routing SingleForm { get { return _Routing; } }
            private Routing()
            {
                CheckForIllegalCrossThreadCalls = false;
                InitializeComponent();
                ReceiveMsg(txtConsumer1);
                ReceiveMsg(txtConsumer2);
                SetText += OnSetText;
            }
    
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                SendMsg();
            }
            /// <summary>
            /// 发送消息
            /// </summary>
            private void SendMsg()
            {
                string message = txtPublisher.Text;
                if (message.Trim().Length <= 0)
                {
                    MessageBox.Show("请输入要发送的消息");
                }
                var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    channel.ExchangeDeclare(exchange: exchangeName,
                        type: exchangeType);
    
                    var routingKey = cbBoxLevel.SelectedValue;
    
                    var body = Encoding.UTF8.GetBytes(message);
                    channel.BasicPublish(exchange: exchangeName,
                        routingKey: routingKey.ToString(),
                        basicProperties: null,
                        body: body);
                }
            }
    
            private void ReceiveMsg(TextBox box)
            {
                try
                {
                    var factory = new ConnectionFactory() { HostName = "localhost" };
                    var connection = factory.CreateConnection();
                    var channel = connection.CreateModel();
    
                    channel.ExchangeDeclare(exchange: exchangeName,
                        type: exchangeType);
    
                    var queueName = channel.QueueDeclare().QueueName;
    
                    if (box.Name == "txtConsumer1")
                    {//消费者1能接受info和error的消息
                        channel.QueueBind(queue: queueName,
                            exchange: exchangeName,
                            routingKey: "info");
                        channel.QueueBind(queue: queueName,
                            exchange: exchangeName,
                            routingKey: "error");
                    }
                    else if (box.Name == "txtConsumer2")
                    {//消费者2能接受debug和error的消息
                        channel.QueueBind(queue: queueName,
                            exchange: exchangeName,
                            routingKey: "debug");
                        channel.QueueBind(queue: queueName,
                            exchange: exchangeName,
                            routingKey: "error");
                    }
    
                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                      {
                          var msg = Encoding.UTF8.GetString(ea.Body);
    
                          box.Invoke(SetText, msg, box);
                      };
    
                    channel.BasicConsume(queue: queueName,
                        noAck: true,
                        consumer: consumer);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            private void OnSetText(string text, TextBox box)
            {
                var split_Result = text.Split(':');
                if (split_Result.Length >= 2)
                    text = split_Result[1];
                box.Text += string.Format("{0}
    ", text);
            }
    
            private void Routing_Load(object sender, EventArgs e)
            {
                List<Receiver> lst = new List<Receiver>();
                lst.Add(new Receiver("消费者1", "info"));
                lst.Add(new Receiver("消费者2", "debug"));
                lst.Add(new Receiver("消费者1,消费者2", "error"));
    
                cbBoxLevel.DataSource = lst;
                cbBoxLevel.DisplayMember = "DisplayMember";
                cbBoxLevel.ValueMember = "ValueMember";
                cbBoxLevel.DropDownStyle = ComboBoxStyle.DropDownList;
            }
    
            private class Receiver
            {
                public Receiver(string displayMember, string valueMember)
                {
                    DisplayMember = displayMember;
                    ValueMember = valueMember;
                }
                public string DisplayMember { get; set; }
                public string ValueMember { get; set; }
            }
        }
    }
    View Code

    界面:

    大概流程:

    生产者绑定一条消息和type='direct'的交换机以及路由键routingKey来发送到队列,消费者绑定同样的交换机和路由键来获取并处理消息

    测试结果:

  • 相关阅读:
    Linux 切换用户
    Java之.jdk安装-Linux
    Java之.jdk安装-Windows
    java注解生成xml和包含CDATA问题
    Spring学习—生成图片验证码
    java学习——java按值传递和按址传递
    温水中被煮熟的程序员-人生的思考
    mysql操作sql的小技巧
    java的classLoader分析与jettty的WebAppClassLoader
    深入Spring:自定义事务管理
  • 原文地址:https://www.cnblogs.com/zhyue93/p/rabbitmq-routing.html
Copyright © 2020-2023  润新知