概述
在项目开发中rabbitmq常用来进行消息收发,这节我通过一个简单的实例来演示在C#中如何进行应用rabbitmq.
首先要在nuget上引用rabbitmq.client:如下图.

最终的效果图:

源码讲解
前台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",//ipPort = 5672,//端口UserName = "guest",//账号Password = "guest",//密码//VirtualHost = "develop" //虚拟主机};}}}return factory.CreateConnection();}}}
这里RabbitMQHelper封装了一个单例模式的RabbitMQ连接,SimpleSendMsg方法用来发送消息,SimpleConsumer用来消费消息,具体的rabbitmq服务端搭建可以百度搜索.
StartExecute方法里面开了两个线程一个用来发送消息一个用来接收消息.
源码下载
百度网盘链接:
https://pan.baidu.com/s/13_3UrCyDHIghWp5nkbiBXw
提取码:6666
