zoukankan      html  css  js  c++  java
  • 【RabbitMQ】2、RabbitMQ入门程序——Hello World

     

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

     

    使用场景:

     

           在项目中,将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

     

     RabbitMQ 

     

    遵循AMQP协议,用erlang语言开发,一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,或者简单地将作业排队以便让分布式服务器进行处理。

     

    RabbitMQ的结构图:


     

    几个概念说明:
    Broker:简单来说就是消息队列服务器实体。
      Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
      Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
      Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
      Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
      vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
      producer:消息生产者,就是投递消息的程序。
      consumer:消息消费者,就是接受消息的程序。
      channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
    消息队列的使用过程大概如下:
     (1)客户端连接到消息队列服务器,打开一个channel。
      (2)客户端声明一个exchange,并设置相关属性。
      (3)客户端声明一个queue,并设置相关属性。
      (4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
      (5)客户端投递消息到exchange

    以上信息大多来自百度百科,也可自行查看,下面是一个简单的demo,完全按照消息队列的使用过程进行编码:


    Maven项目,添加依赖:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.itcast.rabbitmq</groupId>
    <artifactId>itcast-rabbitmq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.4.1</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.7</version>
    </dependency>
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.3.2</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>1.4.0.RELEASE</version>
    </dependency>
    </dependencies>
    </project>

    连接工具类

    public class ConnectionUtil {
    public static Connection getConnection() throws Exception {
    //定义连接工厂
    ConnectionFactory factory = new ConnectionFactory();
    //设置服务地址
    factory.setHost("192.168.88.128");
    //端口
    factory.setPort(5672);
    //设置账号信息,用户名、密码、vhost
    factory.setVirtualHost("/taotao");
    factory.setUsername("www");
    factory.setPassword("www");
    // 通过工程获取连接
    Connection connection = factory.newConnection();
    return connection;
    }
    }

    生产者:

    public class Send {
    private final static String QUEUE_NAME = "test_queue";
    public static void main(String[] argv) throws Exception {
    // 获取到连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    //从连接中创建通道
    Channel channel = connection.createChannel();
    //声明(创建)队列
    channel.queueDeclare(QUEUE_NAME,false,false,false,null);
    //消息内容
    String message="Hello World";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
    channel.close();
    connection.close();
    }
    }


    消费者:

    public class Recv {
    private final static String QUEUE_NAME="test_queue";
    public static void main(String[] args) throws Exception {
    //获取连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    Channel channel = connection.createChannel();
    //声明队列
    channel.queueDeclare(QUEUE_NAME,false,false,false,null);
    //定义队列的消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    //监听队列
    channel.basicConsume(QUEUE_NAME,true,consumer);//true自动模式
    //获取消息
    while (true)
    {
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    String message = new String(delivery.getBody());
    System.out.println(" [x] Received '" + message + "'");
    }
    }
    } 


    小结:

        之前也写过一篇socket编程的例子。通过这个例子感觉RabbitMQ与socket编程有相似的地方

        (1)相同:

        socket有服务端和客户端,RabbitMQ有生产者和消费者,都可以互通消息。

        socket客户端通过new Socket('主机号','端口号');服务端通过new ServerSocket('端口号');并且通过accept()方法进行监听,等待连接;它们都是通过输入输出流交换数据。

        RabbitMQ通过创建通道,创建队列

         (2)不同:

         socket是即时连接,像打电话,如果客户端或者服务端有一个断开,那么消息连接就会中断,信息就会丢失,而RabbitMQ会将消息放入队列,消费者从队列中取消息,不存在这个问题。

  • 相关阅读:
    Windows Server AppFabric:更好,更快,更便宜
    扩展DropDownList控件和ListBox控件(1) 支持分组功能(optgroup标签)
    化零为整WCF(3) 绑定Binding(basicHttpBinding和netTcpBinding)
    化零为整WCF(9) 序列化(DataContractSerializer, XmlSerializer, DataContractJsonSerializer, SoapFormatter, BinaryFormatter)
    化零为整WCF(1) 不能免俗,我也从Hello开始
    化零为整WCF(12) 并发和限流(Concurrent和Throttle)
    化零为整WCF(6) 消息处理(异步调用OneWay, 双向通讯Duplex)
    化零为整WCF(8) 消息处理(使用流数据传输文件)
    招聘ASP.NET高级·中级软件开发工程师[北京][过期]
    化零为整WCF(7) 消息处理(使用消息传输优化机制 MTOM)
  • 原文地址:https://www.cnblogs.com/eastday/p/9692373.html
Copyright © 2011-2022 走看看