RabbitMQ集成及使用

╄→гoц情女王★ 提交于 2020-02-03 16:18:51

一、下载并配置RabbitMQ https://www.cnblogs.com/vipstone/p/9275256.html

二、使用

1、在POM中添加依赖

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.6.0</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
    <scope>compile</scope>
</dependency>

2、RabbitUtil

package RabbitMQ实现.RabbitUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.*;


/*
 * author: hubz
 * datetime: 2020/2/2 14:31
 */
// https://segmentfault.com/a/1190000012439688
// https://www.cnblogs.com/vipstone/p/9275256.html

public class RabbitMQUtil {
    private static final String HOST = "127.0.0.1";
    private static final int PORT = 5672;
    private static final String USERNAME = "guest";
    private static final String PASSWORD = "guest";
    private static ConnectionFactory factory;

    static{
        // 1、创建连接管理器
        factory = new ConnectionFactory();
        // 设置RabbitMQ相关信息
        factory.setHost(HOST);
        //设置RabbitMQ协议端口
        factory.setPort(PORT);
        //设置RabbitMQ用户名
        factory.setUsername(USERNAME);
        //设置RabbitMQ密码
        factory.setPassword(PASSWORD);
        //设置RabbitMQ数据库
        factory.setVirtualHost("/");//VirtualHost默认为/
    }
    public static Connection getConnection() throws IOException, TimeoutException {
        // 2、创建一个新的连接
        return  factory.newConnection();
    }

    public static void main(String[] args) throws IOException, TimeoutException {
        /*
         * ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
         *
         * Channel(信道):消息推送使用的通道;
         *
         * RoutingKey(路由键/关键字):用于把生成者的数据分配到交换器上;
         *
         * Exchange(交换器):用于接受、分配消息;
         *              可以没有交换器,一个信道对应 一个/多个 消息队列
         *              发送消息时指定路由关键字
         *
         * BindingKey(绑定键):用于把交换器的队列绑定到队列上;
         *
         * Queue(队列):用于存储生产者的消息;
         *
         */

        Connection connection = getConnection();

        // 3、创建一个信道
        Channel channel = connection.createChannel();

        String EXCHANGE_NAME = "TestExchange";
        // 4、创建一个交换器
        /*
         * 声明一个交换机
         * exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, Map<String, Object> arguments)
         *
         * exchange:交换机的名字
         * type:交换机类型
         *
         * durable:参考queueDeclare中的同名参数
         * autoDelete:参考queueDeclare中的同名参数
         * arguments:参考queueDeclare中的同名参数
         */

        channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);


        // 5、声明一个队列
        /*
         * 作用:声明队列--->在没有队列时创建队列,有则复用,如果没有队列,有消息,消息则无处可存
         * channel.queueDeclare(String queue,
         *                      boolean durable,
         *                      boolean exclusive,
         *                      boolean autoDelete,
         *                      Map<String, Object> arguments)
         *
         *
         * name:队列名字
         * durable:是否持久化。默认保存到内存中,RabbitMQ重启会丢失,如果想重启后还存在,就需要使队列持久化
         *          持久化后,保存到Erlang自带的Mnesia数据库中,当RabbitMQ重启之后会读取该数据库
         *
         * exclusive:是否是排它的;作用:当连接关闭时connection.close(),该队列是否会自动删除(是否为当前连接的专用队列)
         *              如果一个队列声明为排它队列,该队列公对首次声明它的连接可见,并在连接断开时自动删除;
         *
         *          排它:是基于连接的Connection可见的,同一个连接的不同信道是可以同时访问同一个连接创建的排他队列;
         *
         *          首次:是指如果一个连接已经声明了一个排他队列,其它连接是不允许建立同名的排他队列,这个与普通队列不同,即使该队
         *          列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除;
         *
         *          这个队列适用于一个客户端同是发送和读取消息的应用场景
         *
         * autoDelete:是否自动删除队列。当最后一个消费者断开连接之后队列是否自动删除,可以通过控制台来查看队列的
         *          消费者数量,当cunsumers=0时队列就会自动删除
         *
         *          至少有一个消息者连接到这个队列,之后所有与这个队列连接的消息都断开时,才会自动删除;
         *
         *          生产者客户端创建这个队列,或者没有消息者客户端连接这个队列时,不会自动删除这个队列;
         *
         * noWait:是否等待服务器返回
         * args:相关参数,目前一般为null
         */
        // channel.queueDeclare("queueName", true, false, false, null);

        channel.queueDeclare("queue",true,false,false,null);

        System.out.println("Producer Send begin");


        // 6、绑定
        /*
         * 将交换器与队列通过路由键绑定
         * queueBind(String queue, String exchange, String routingKey)
         *
         * queue:队列名称
         * exchange:交换器名称
         * routingKey:路由key或者绑定key
         *
         * https://blog.csdn.net/CleverCode/article/details/80684550
         */
         //使用参考:https://blog.csdn.net/Hubz131/article/details/104156079
         //channel.queueBind("","","");

        /*
         * 设置消息持久化:
         *  设置消息持久化必须先设置队列持久化,要不然队列不持久化,消息持久化,队列都不存在了,消息存在还有什么意义。
         *  消息持久化需要将交换机持久化、队列持久化、消息持久化,才能最终达到持久化的目的
         */
        //消息持久化方式一
        // AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties().builder();
        // properties.deliveryMode(2);  // 设置消息是否持久化,1: 非持久化 2:持久化
        // channel.basicPublish("", "queueName", properties.build(), "hello World1".getBytes("UTF-8"));

        //消息持久化方式二
        // channel.basicPublish("", "queueName", null, "hello World1".getBytes("UTF-8"));

        //消息持久化方式三
        // channel.basicPublish("", "queueName", MessageProperties.PERSISTENT_TEXT_PLAIN, "hello World1".getBytes("UTF-8"));

        /*
         * 作用:消息生产者发送消息给消息队列
         * basicPublish(String exchange,
         *              String routingKey,
         *              boolean mandatory,
         *              boolean immediate,
         *              BasicProperties props,
         *              byte[] body)
         *
         * exchange:交换机名称
         *
         * routingKey:路由关键字
         *
         * mandatory:
         *      true:交换器无法根据自动的类型和路由键找到一个符合条件的队列,那么RabbitMq会调用Basic.Ruturn命令将消息返回给生产者;
         *      false:出现上述情况消息被直接丢弃;
         *
         * immediate:消息是否立即发送出去
         *  为true时:
         *      如果交换器在消息路由到队列时发现没有任何消费者,那么这个消息将不会存入队列,
         *      当与路由匹配的所有队列都没有消费者时,会Basic.Return返回给生产者;
         *
         * props:消息的基本属性,例如路由头等
         * body:消息内容
         */
        channel.basicPublish("TestExchange","",null,"HaHa".getBytes("UTF-8"));

        System.out.println("Producer Send end");

        channel.close();
        connection.close();
    }
}

/*
 * 虚拟主机
 *      每个Rabbit都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都是mini版的RabbitMQ,拥有自己的队列,交换器和绑定,拥有自己的权限机制。
 *
 *      vhost特性:
 *          1) RabbitMQ默认的vhost是“/”开箱即用;
 *          2) 多个vhost是隔离的,多个vhost无法通讯,并且不用担心命名冲突(队列和交换器和绑定),实现了多层分离;
 *          3) 创建用户的时候必须指定vhost;
 *
 *      vhost操作:
 *          创建vhost:      rabbitmqctl add_vhost [vhost_name]
 *          删除vhost:      rabbitmqctl delete_vhost [vhost_name]
 *         查看所有的vhost:  rabbitmqctl list_vhosts
 *
 *
 */
/*
 *交换机类型:
 *      Direct:https://blog.csdn.net/CleverCode/article/details/80684550
 *      fanout:https://blog.csdn.net/CleverCode/article/details/80714298
 *      Topic:https://blog.csdn.net/CleverCode/article/details/80719014
 */

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!