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

概述

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

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

c3575fead5c2b268f493eec241bbc09f.png

最终的效果图:

6b3f33f8db6a9c1c04e94f75561216d2.png

源码讲解

     前台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

技术群:添加小编微信sf-1738658853

公众号:dotnet讲堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值