zoukankan      html  css  js  c++  java
  • WinForm实现Rabbitmq官网6个案例-Topics

    代码:

    namespace RabbitMQDemo
    {
        public partial class Topics : Form
        {
            private string exchangeName = "topic_logs"; //
            private string exchangeType = ExchangeType.Topic;//交换机类型
            private readonly static Topics _Topics;
            Action<string, TextBox> SetText;
            static Topics()
            {
                _Topics = new Topics();
            }
            /// <summary>
            /// 单例模式
            /// </summary>
            public static Topics SingleForm { get { return _Topics; } }
            private Topics()
            {
                CheckForIllegalCrossThreadCalls = false;
                InitializeComponent();
                ReceiveMsg(txtConsumer1);
                ReceiveMsg(txtConsumer2);
                SetText += OnSetText;
            }
    
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                SendMsg();
            }
    
            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 = cbBoxRoutingKey.Text;
                    var body = Encoding.UTF8.GetBytes(message);
                    channel.BasicPublish(exchange: exchangeName,
                        routingKey: routingKey,
                        basicProperties: null,
                        body: body);
                }
            }
    
            private void ReceiveMsg(TextBox box)
            {
                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
                    channel.QueueBind(queue: queueName,
                        exchange: exchangeName,
                        routingKey: "*.*.one");
                    channel.QueueBind(queue: queueName,
                        exchange: exchangeName,
                        routingKey: "one.#");
                }
                else if (box.Name == "txtConsumer2")
                {//消费者2
                    channel.QueueBind(queue: queueName,
                        exchange: exchangeName,
                        routingKey: "*.*.two");
                    channel.QueueBind(queue: queueName,
                        exchange: exchangeName,
                        routingKey: "two.#");
                }
    
                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);
            }
            private void OnSetText(string text, TextBox box)
            {
                box.Text += string.Format("{0}
    ", text);
            }
    
            private void Topics_Load(object sender, EventArgs e)
            {
                string[] dataSource = new string[] { "send.msg.one", "send.msg.two", "one.receive.msg", "two.receive.msg" };
                cbBoxRoutingKey.DataSource = dataSource; cbBoxRoutingKey.DropDownStyle = ComboBoxStyle.DropDown;
            }
        }
    }
    View Code

    界面:

    大概流程:

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

    测试结果:

  • 相关阅读:
    flask的过滤器
    flask的for、if语法
    flask模版语法
    flask response跳转页面
    flask 简单注册页面
    Egress 网关 TLS 连接 发起的过程 (SDS)
    Egress Gateway
    Egress TLS Origination
    Istio ServiceEntry 访问外部服务
    font awesome icon
  • 原文地址:https://www.cnblogs.com/zhyue93/p/rabbitmq-topic.html
Copyright © 2011-2022 走看看