美高梅网址注册-澳门mgm4858集团登录网址
做最好的网站
来自 澳门mgm4858集团登录网址 2019-10-07 11:22 的文章
当前位置: 美高梅网址注册 > 澳门mgm4858集团登录网址 > 正文

而MQ则是遵循了AMQP协议的具体实现和产品,消息

1、Erlang

由于RabbitMQ软件本身是基于Erlang开发的,所以想要运行RabbitMQ必须要先按照Erlang

Erlang官网

Erlang下载地址

4、插件

     RabbitMQ提供了很多好用的插件,最常用的就是web管理工具,启动此插件。

     CMD中运行命令:rabbitmq-plugins enable rabbitmq_management

     注:rabbitmq-plugins 所在路径为:D:Program FilesRabbitMQ Serverrabbitmq_server-3.6.9plugins

     web管理工具的地址是: 初始密码:guest

RabbitMQ–环境搭建

 

RabbitMQ

RabbitMQ才是实现消息队列的核心RabbitMQ官网

美高梅网址注册 ,RabbitMQ下载

6、Demo练习。

消息生产者:

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ConnectionFactory factory = new ConnectionFactory();
                factory.HostName = Constants.MqHost;
                factory.Port = Constants.MqPort;
                factory.UserName = Constants.MqUserName;
                factory.Password = Constants.MqPwd;
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel channel = conn.CreateModel())
                    {
                        //在MQ上定义一个持久化队列,如果名称相同不会重复创建
                        channel.QueueDeclare("MyFirstQueue", true, false, false, null);
                        while (true)
                        {
                            string customStr = Console.ReadLine();
                            RequestMsg requestMsg = new RequestMsg();
                            requestMsg.Name = string.Format("Name_{0}", customStr);
                            requestMsg.Code = string.Format("Code_{0}", customStr);
                            string jsonStr = JsonConvert.SerializeObject(requestMsg);
                            byte[] bytes = Encoding.UTF8.GetBytes(jsonStr);

                            //设置消息持久化
                            IBasicProperties properties = channel.CreateBasicProperties();
                            properties.DeliveryMode = 2;
                            channel.BasicPublish("", "MyFirstQueue", properties, bytes);

                            //channel.BasicPublish("", "MyFirstQueue", null, bytes);

                            Console.WriteLine("消息已发送:" + requestMsg.ToString());
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                Console.WriteLine(e1.ToString());
            }
            Console.ReadLine();
        }
    }

 

 

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ConnectionFactory factory = new ConnectionFactory();
                factory.HostName = Constants.MqHost;
                factory.Port = Constants.MqPort;
                factory.UserName = Constants.MqUserName;
                factory.Password = Constants.MqPwd;
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel channel = conn.CreateModel())
                    {
                        //在MQ上定义一个持久化队列,如果名称相同不会重复创建
                        channel.QueueDeclare("MyFirstQueue", true, false, false, null);

                        //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
                        channel.BasicQos(0, 1, false);

                        Console.WriteLine("Listening...");

                        //在队列上定义一个消费者
                        QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                        //消费队列,并设置应答模式为程序主动应答
                        channel.BasicConsume("MyFirstQueue", false, consumer);

                        while (true)
                        {
                            //阻塞函数,获取队列中的消息
                            BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                            byte[] bytes = ea.Body;
                            string str = Encoding.UTF8.GetString(bytes);
                            RequestMsg msg = JsonConvert.DeserializeObject<RequestMsg>(str);
                            Console.WriteLine("HandleMsg:" + msg.ToString());
                            //回复确认
                            channel.BasicAck(ea.DeliveryTag, false);
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                Console.WriteLine(e1.ToString());
            }
            Console.ReadLine();
        }
    }

 

澳门mgm4858集团登录网址 ,     美高梅网址注册 1
     美高梅网址注册 2

这是个人的总结,只是简单的安装和使用,积累了更好的经验在记录下来。

MQ

  MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。

 

在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。不过大多数不仅仅是无需即时返回,甚至是执行是否成功都无所谓。如果需要即时返回则可以使用Dubbo,Spring boot与Dubbo集成可以去看Spring boot 集成Dubbox

5. RabbitMQ的一些概念

     - 连接(Connection),与RabbitMQ Server建立的一个连接,由ConnectionFactory创建,每个connection只与一个物理的Server进行连接,此连接是基于Socket进行连接的,这个可以相似的理解为像一个DB Connection。AMQP一般使用TCP链接来保证消息传输的可靠性。

     - 通道 (Channel),在C#客户端里应该是叫Model,不明白为什么这么取名字,其他客户端基本都叫Channel。建立在Connection基础上的一个通道,相对于Connection来说,它是轻量级的。它就像是Hibernate里面的Session一样。Channel 主要进行相关定义,发送消息,获取消息,事务处理等。Channel可以在多线程中使用,但是在必须保证任何时候只有一个线程执行命令。一个Connection可以有多个Channel。客户端程序有时候会是一个多线程程序,每一个线程都想要和RabbitMQ进行连接,但是又不想共享一个连接,这种需求还是比较普遍的。因为一个Connection就是一个TCP链接,RabbitMQ在设计的时候不希望与每一个客户端保持多个TCP连接,但这确实是有些客户端的需求,所以在设计中引入了Channel的概念,每一个Channel之间没有任何联系,是完全分离的。多个Channel来共享一个Connection。

      - 交换器(Exchange),它是发送消息的实体。

      - 队列(Queue),这是接收消息的实体。

      - 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。

MQ特点

  MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。

 

  • 安装Erlang
  • 安装RabbitMQ Server
  • 下载客户端dll(亦称驱动)

本文由美高梅网址注册发布于澳门mgm4858集团登录网址,转载请注明出处:而MQ则是遵循了AMQP协议的具体实现和产品,消息

关键词: