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

    先上代码

    namespace RabbitMQDemo
    {
        public partial class HelloWorld : Form
        {
            string queueName1 = "hello_queue1";//消费者1
            string queueName2 = "hello_queue2";//消费者2
            Action<string> SetText;
            /// <summary>
            /// 单线程实例
            /// </summary>
            private static readonly HelloWorld _helloWorld;
            static HelloWorld()
            {
                _helloWorld = new HelloWorld();
            }
            /// <summary>
            /// 单例模式
            /// </summary>
            public static HelloWorld SingleForm
            { get { return _helloWorld; } }
            private HelloWorld()
            {
                CheckForIllegalCrossThreadCalls = false;
                InitializeComponent();
                ReseiveMsg(queueName1);
                ReseiveMsg(queueName2);
                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("请输入要发送的消息");
                }
                string queueName = cbBoxQueues.SelectedValue.ToString();
                var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: queueName,
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);
    
                    var body = Encoding.UTF8.GetBytes(message);
    
                    channel.BasicPublish(exchange: "",
                                         routingKey: queueName,
                                         basicProperties: null,
                                         body: body);
                }
            }
    
            /// <summary>
            /// 接收消息
            /// </summary>
            private void ReseiveMsg(string queueName)
            {
                //string queueName = cbBoxQueues.SelectedText;
                try
                {
                    var factory = new ConnectionFactory() { HostName = "localhost" };
    
                    //connection和channel不能使用using,否则会被dispose掉
                    var connection = factory.CreateConnection();
                    var channel = connection.CreateModel();
                    //声明队列 生产者和消费者都需要QueueDeclare
                    channel.QueueDeclare(queue: queueName,
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);
    
                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                    {
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
    
                        txtConsumer1.Invoke(SetText, message);
                    };
                    channel.BasicConsume(queue: queueName,
                                         noAck: true,
                                         consumer: consumer);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    
            private void OnSetText(string txtContent)
            {
                string queueName = cbBoxQueues.SelectedValue.ToString();
                if (queueName == queueName1)
                    txtConsumer1.Text += string.Format("{0}
    ", txtPublisher.Text);
                if (queueName == queueName2)
                    txtConsumer2.Text += string.Format("{0}
    ", txtPublisher.Text);
            }
    
            private void HelloWorld_Load(object sender, EventArgs e)
            {
                List<DataSource> lst = new List<DataSource>();
                lst.Add(new DataSource("消费者1", "hello_queue1"));
                lst.Add(new DataSource("消费者2", "hello_queue2"));
    
                cbBoxQueues.DataSource = lst;
                cbBoxQueues.DisplayMember = "DisplayMember";
                cbBoxQueues.ValueMember = "DisplayValue";
            }
    
            private class DataSource
            {
                public DataSource(string displayMember,string displayValue)
                {
                    DisplayMember = displayMember;
                    DisplayValue = displayValue;
                }
                public string DisplayMember { get; set; }
                public string DisplayValue { get; set; }
            }
        }
    }
    View Code

    界面如下:

    大致流程是

    生产者发送消息到队列,然后队列(rabbitmq)把消息发送给消费者(消费者向rabbitmq索取消息)

     两个消费者:

  • 相关阅读:
    书单
    x&(x1)表达式的意义
    约瑟夫环,杀人游戏(静态循环链表实现)
    我的第一个动态规划程序(试图用递归求斐波拉契数)
    NYOJ 2题 括号配对问题
    为什么 C++不叫作++C? o(∩_∩)o
    文字常量区,字符串常量
    括号匹配(栈实现)
    Mybatis的逆向工程(generator)
    Mybatis学习一(介绍/举例/优化)
  • 原文地址:https://www.cnblogs.com/zhyue93/p/rabbitmq-helloworld.html
Copyright © 2011-2022 走看看