C#进程间通信的几种方式:消息队列

方式三:消息队列

“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。消息队列(Message Queue)是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

消息队列主要应用于解耦,异步消息,流量削锋和消息通讯等场景中。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

在这里我们介绍的是消息通信场景,消息队列在进程间通信时传递带有不同类型值的数据块。

以RabbitMQ(一套开源的消息队列服务软件)为例,写一个简单的系统自动创建key的单发送单接收的控制台应用程序。

Erlang及RabbitMQ的安装和配置参考https://www.cnblogs.com/ericli-ericli/p/5902270.html

1、MQHelper.cs类:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using RabbitMQ.Client.Framing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EasyMQSend
{
    public class MQHelper
    {
        private static string queue = "EasyMQ";
        public static string resultStr = "";
        #region 发送消息
        /// 
        /// 发送一条消息(手动创建列队)
        /// 
        public static void SendMessage(string str)
        {
            try
            {
                var connectionFactory = new ConnectionFactory { HostName = "localhost" };
                using (var connection = connectionFactory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        BasicProperties basicProperties = new BasicProperties { Persistent = true };
                        byte[] payload = Encoding.UTF8.GetBytes(str);
                        channel.BasicPublish("", queue, basicProperties, payload);
                    }
                }
            }
            catch (Exception ex)
            {
                
            }
        }
        #endregion

        #region 接受消息
        /// 
        /// 接受消息
        /// 
        public static void AcceptMessage()
        {
            ConnectionFactory connectionFactory1 = new ConnectionFactory { HostName = "localhost" };
            var connection = connectionFactory1.CreateConnection();
            var channel = connection.CreateModel();
            var consumer = new EventingBasicConsumer(channel);
            channel.QueueDeclare(queue, true, false, false, null);

            consumer.Received += (ch, deliver) =>
            {
                resultStr = Encoding.UTF8.GetString(deliver.Body);
            };
            channel.BasicConsume(queue, true, consumer);
        }
        #endregion
    }
}

2、接收端控制台程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EasyMQAccept
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                MQHelper.AcceptMessage();
                if (!string.IsNullOrEmpty(MQHelper.resultStr))
                {
                    Console.WriteLine(MQHelper.resultStr);
                    MQHelper.resultStr = "";
                    break;
                }
            }
        }
    }
}

3、发送端控制台程序 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EasyMQSend
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MQHelper.SendMessage("Hello MQ");
            }
            catch (Exception ex)
            {
                
            }
        }
    }
}

4、打开RabbitMQ运行程序:

 

 

C#进程间通信的几种方式:消息队列_第1张图片

 

 

你可能感兴趣的:(C#)