C# WPF RabbitMq收发消息实例解析

概述

在项目开发中rabbitmq常用来进行消息收发,这节我通过一个简单的实例来演示在C#中如何进行应用rabbitmq.

首先要在nuget上引用rabbitmq.client:如下图.

C# WPF RabbitMq收发消息实例解析

最终的效果图:

C# WPF RabbitMq收发消息实例解析

源码讲解

     前台XMAL:

<UserControl x:Class="Caliburn.Micro.Hello.Views.RabbitMqView"             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"              xmlns:local="clr-namespace:Caliburn.Micro.Hello.Views"              xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"             mc:Ignorable="d"              d:DesignHeight="450" d:DesignWidth="800">    <UserControl.Resources>        <ResourceDictionary>            <ResourceDictionary.MergedDictionaries>                <ResourceDictionary Source="/Styles/CommonStyle.xaml" />            </ResourceDictionary.MergedDictionaries>        </ResourceDictionary>    </UserControl.Resources>    <Grid>        <Grid.ColumnDefinitions>            <ColumnDefinition Width="*"/>            <ColumnDefinition Width="*"/>        </Grid.ColumnDefinitions>        <Grid.RowDefinitions>            <RowDefinition Height="9*"/>            <RowDefinition Height="1*"/>        </Grid.RowDefinitions>        <StackPanel Margin="5,0,0,0"  Grid.Column="0">            <Label  VerticalAlignment="Top"                    Content="Simple Send Msg"                    Style="{StaticResource TitleLabelStyle}" />            <TextBlock  Background="White"  Height="300"                     VerticalAlignment="Top" TextWrapping="NoWrap" Name="DisplayInfo1"/>        </StackPanel>        <StackPanel Margin="5,0,0,0"  Grid.Column="1">            <Label  VerticalAlignment="Top"                    Content="Simple Consumer"                    Style="{StaticResource TitleLabelStyle}" />            <TextBlock  Background="White"  Height="300"                     VerticalAlignment="Top" TextWrapping="NoWrap" Name="DisplayInfo2"/>        </StackPanel>        <Button  Grid.Row="1" Grid.ColumnSpan="2" Margin="2"  Name="StartExecute"                                      Style="{StaticResource BaseContentButtonStyle}"  Height="30" MinWidth="70"                                     Content="Start Execute" />    </Grid></UserControl>

这里左边是要发送的消息,右边是接受到的消息,每次点击start execute后会发送10条消息.

后台cs逻辑代码:

using RabbitMQ.Client;using RabbitMQ.Client.Events;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Caliburn.Micro.Hello.ViewModels{    public class RabbitMqViewModel : Screen, IViewModel    {        private static string queueName = "simple_order";//队列名        private StringBuilder stringBuilder1 = new StringBuilder();        private StringBuilder stringBuilder2 = new StringBuilder();        public string DisplayInfo1 { get; set; }        public string DisplayInfo2 { get; set; }        public RabbitMqViewModel()        {            DisplayName = "RabbitMq";        }        public void StartExecute()        {            Task.Run(() =>            {                SimpleSendMsg("Hello RabbitMQ");            });            Task.Run(() =>            {                SimpleConsumer();            });        }        public void SimpleSendMsg(string message)        {            //创建连接            using (var connection = RabbitMQHelper.GetConnection())            {                //创建信道                using (var channel = connection.CreateModel())                {//创建队列                    channel.QueueDeclare(queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);                    for (var i = 0; i < 10; i++)                    {                        var body = Encoding.UTF8.GetBytes(message);//发送消息                        channel.BasicPublish(exchange: "", routingKey: queueName, mandatory: false, basicProperties: null, body);                        stringBuilder1.AppendLine($"发送消息到队列:{queueName},内容:{message}");                        Execute.OnUIThread(() =>                        {                            DisplayInfo1 = stringBuilder1.ToString();                        });                        Thread.Sleep(1000);                    }                }            }        }        public void SimpleSendMsg()        {            //创建连接            using (var connection = RabbitMQHelper.GetConnection())            {                //创建信道                using (var channel = connection.CreateModel())                {//创建队列                    channel.QueueDeclare(queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);                    for (var i = 0; i < 10; i++)                    {                        string message = $"Hello RabbitMQ MessageHello,{i + 1}";                        var body = Encoding.UTF8.GetBytes(message);//发送消息                        channel.BasicPublish(exchange: "", routingKey: queueName, mandatory: false, basicProperties: null, body);                        stringBuilder1.AppendLine($"发送消息到队列:{queueName},内容:{message}");                        Execute.OnUIThread(() =>                        {                            DisplayInfo1 = stringBuilder1.ToString();                        });                    }                }            }        }        public void SimpleConsumer()        {            var connection = RabbitMQHelper.GetConnection();            {                //创建信道                var channel = connection.CreateModel();                {                    //创建队列                    channel.QueueDeclare(queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);                    var consumer = new EventingBasicConsumer(channel);                    int i = 0;                    consumer.Received += (model, ea) =>                    {                        //消费者业务处理                        var message = Encoding.UTF8.GetString(ea.Body.ToArray());                        stringBuilder2.AppendLine($"{i},队列{queueName}消费消息长度:{message.Length},内容 = {message}");                        Execute.OnUIThread(() =>                        {                            DisplayInfo2 = stringBuilder2.ToString();                        });                        i++;                    };                    channel.BasicConsume(queueName, true, consumer);                }            }        }    }    /// <summary>    /// RabbitMQ帮助类    /// </summary>    public class RabbitMQHelper    {        private static ConnectionFactory factory;        private static object lockObj = new object();        /// <summary>        /// 获取单个RabbitMQ连接        /// </summary>        /// <returns></returns>        public static IConnection GetConnection()        {            if (factory == null)            {                lock (lockObj)                {                    if (factory == null)                    {                        factory = new ConnectionFactory                        {                            HostName = "localhost",//"172.16.2.84",//ip                            Port = 5672,//端口                            UserName = "guest",//账号                            Password = "guest",//密码                            //VirtualHost = "develop" //虚拟主机                        };                    }                }            }            return factory.CreateConnection();        }    }}

这里RabbitMQHelper封装了一个单例模式的RabbitMQ连接,SimpleSendMsg方法用来发送消息,SimpleConsumer用来消费消息,具体的rabbitmq服务端搭建可以百度搜索.

StartExecute方法里面开了两个线程一个用来发送消息一个用来接收消息.

源码下载

百度网盘链接:

https://pan.baidu.com/s/13_3UrCyDHIghWp5nkbiBXw

提取码:6666