消息中间件RabbitMQ26_RabbitMQ快速入门3

一、入门程序

 需求:使用简单模式完成消息传递

 步骤:
  1. 创建工程(生成者、消费者)
  2. 分别添加依赖
  3. 编写生产者发送消息
  4. 编写消费者接收消息

  实现:

  1. 先创建一个空项目:rabbitmq,然后在rabbitmq下创建两个module(maven工程):rabbitmq-producer和rabbitmq-consumer

  2. 两个工程都添加依赖

   <dependencies>
        <!--rabbitmq java 客户端-->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.6.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

  3. 编写生产者发送消息

package com.itheima.producer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 发送消息
 */
public class Producer_HelloWorld {

    public static void main(String[] args) throws IOException, TimeoutException {
        //1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2、设置参数
        factory.setHost("192.168.240.132");//ip 默认值是localhost
        factory.setPort(5672);//端口    默认值是5672
        factory.setVirtualHost("/itcast");//虚拟机 默认值是/
        factory.setUsername("heima");//用户名  默认值是guest
        factory.setPassword("heima");//密码   默认值是guest

        //3、创建连接    Connection
        Connection connection = factory.newConnection();

        //4、创建Channel

        Channel channel = connection.createChannel();

        //5、创建队列Queue
        /**
         * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
         *  参数:
         *      queue:队列名称
         *      durable:是否持久化,当mq重启之后,还在
         *      exclusive:是否独占。
         *              只能有一个消费者监听这个队列;
         *              当Connection关闭时,是否删除队列
         *      autoDelete:是否自动删除。当没有Consumer时,自动删除掉
         *      arguments:参数。
         */
        //如果没有一个名字叫hello_world的队列,则会创建该队列,如果有则不会创建
        channel.queueDeclare("hello_world",true,false,false,null);

        //6、发送消息给Queue
        /**
         * (String exchange, String routingKey, BasicProperties props, byte[] body)
         * 参数:
         *      exchange:交换机名称。简单模式下交换机会使用默认的 ""
         *      routingKey:路由名称。使用默认的交换机则要跟队列名称一致
         *      props:配置信息
         *      body:发送的消息数据
         */
        String body ="hello rabbitmq...";
        channel.basicPublish("","hello_world",null,body.getBytes());

        //7、释放资源
        channel.close();
        connection.close();

    }
}

  执行生产者,检查rabbitMQ管控台:

   Connections和Channel都为0因为最后释放了资源,Queue中有1条消息未被消费,消费者数量为0

      

   

  不释放资源(把最后两行代码注释掉),重新执行那么Connections和Channel就会有数据,Queue中有2条消息

   

   

   

  4. 编写消费者接收消息

package com.itheima.consumer;

import com.rabbitmq.client.*;
import java.io.IOException;

public class Consumer_HelloWorld {

    public static void main(String[] args) throws Exception{
        //1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2、设置参数
        factory.setHost("192.168.240.132");//ip 默认值是localhost
        factory.setPort(5672);//端口    默认值是5672
        factory.setVirtualHost("/itcast");//虚拟机 默认值是/
        factory.setUsername("heima");//用户名  默认值是guest
        factory.setPassword("heima");//密码   默认值是guest

        //3、创建连接    Connection
        Connection connection = factory.newConnection();

        //4、创建Channel

        Channel channel = connection.createChannel();

        //5、创建队列Queue,可以不写
        /**
         * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
         *  参数:
         *      queue:队列名称
         *      durable:是否持久化,当mq重启之后,还在
         *      exclusive:是否独占。
         *              只能有一个消费者监听这个队列;
         *              当Connection关闭时,是否删除队列
         *      autoDelete:是否自动删除。当没有Consumer时,自动删除掉
         *      arguments:参数。
         */
        //如果没有一个名字叫hello_world的队列,则会创建该队列,如果有则不会创建
        channel.queueDeclare("hello_world",true,false,false,null);

        //6、接收消息
        /**
         * basicConsume(String queue, boolean autoAck, Consumer callback)
         * 参数:
         *      queue:队列名称
         *      autoAck:是否自动确认
         *      callback:回调对象
         */
        Consumer consumer=new DefaultConsumer(channel){
            /**
             *  回调方法,当收到消息后会自动执行该方法
             *      consumerTag:标识
             *      envelope:获取一些信息,交换机,路由key...
             *      properties:配置信息
             *      body:数据
             */

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag:"+consumerTag);
                System.out.println("Exchange:"+envelope.getExchange());
                System.out.println("RoutingKey:"+envelope.getRoutingKey());
                System.out.println("properties:"+properties);
                System.out.println("body:"+new String(body));
            }
        };
        channel.basicConsume("hello_world",true,consumer);
        //关闭资源?不要
    }
}

  控制台停掉发送者执行,执行消费者,控制台输出2条一样的信息,因为发送者发送了2条消息,消费者都接收了

  查看RabbitMQ管控台:发送者发送的消息变成0,Consumers个数为1

   

   

二、小结

 上述的入门案例中其实使用的是如下的简单模式:

  

 在上图的模型中,有以下概念:

  • P:生产者,也就是要发送消息的程序
  • C:消费者:消息的接收者,会一直等待消息到来
  • queue:消息队列,图中黄色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息

 

posted on 2024-04-11 17:00  花溪月影  阅读(2)  评论(0编辑  收藏  举报