RabbitMq_Producer 详解

package com.clown.message;

import com.rabbitmq.client.*;
import org.junit.Test;

public class MqTest {

    public final static String IP_ADDRESS = "127.0.0.1";
    public  final static  int PORT = 5672;
    public final static  String VIRTUAL_HOST = "/";
    public final  static String  EXCHANGE_NAME = "exchange2";
    public final static  String QUEUE_NAME ="demo_queue_2";
    public final static String ROUTING_KEY = "routingkey_demo";

    public  Connection getConnection() throws Exception{
        ConnectionFactory factory = new ConnectionFactory() ;
        factory.setHost(IP_ADDRESS) ;
        factory.setPort(PORT) ;
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost(VIRTUAL_HOST);
        Connection connection = factory.newConnection();//
        return  connection;
    }


    /**
     * 创建交换器
     *
     *
     * @throws Exception
     */
    @Test
    public void createExchange() throws Exception{
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        /**
         * 参数的含义:
         *
         * 指定交换器的名称
         * 指定交换器的类型
         * 指定交换器是否持久化
         * 指定交换器是否自动删除
         *
         *
         * 对名称相同一个交换器设置与之前不同的交换器其他属性会导致异常,但是如果所有属性都一样不会报错。
         *
         * 如果要改变一个交换器的属性好的方法是先删除掉旧的,然后创建同名的交换机
         */
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);
    }


    /**
     * 创建Queue
     */
    @Test
    public void createQueue() throws  Exception{
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);

        /**
         * 参数:
         * 队列名称
         * 持久化
         *    持久化的队列会存盘,在服务器重启的时候不会丢失相关信息。
         * 是否排他:
         *      如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并且在断开连接的时候自动删除
         *      排他队列是基于Connection可见的,同一个连接的多个信道可以同时访问同一链接创建的排他队列。
         *      首次创建 一个连接已经声明了一个排他的队列 其他的连接不允许建立同名的排他队列,
         *
         *      特别地,即使排他队列设置了持久化。一旦连接关闭 或者客户端退出 排他队列都会被自动删除。
         *
         * 是否自动删除:
         *      至少有一个消费者连接到这个队列,之后所有与这个队列的连接都关闭。
         *      既:当生产者创建这个队列,如果没有客户端与这个队列建立连接,或者都未关闭连接,
         *      这个队列不会自动删除。
         *
         *
         * 设置一些队列的参数
         *
         *
         */
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);

    }


    /**
     * queueBind 方法测试
     *
     *
     * 绑定队列跟交换机
     */
    @Test
    public void testQueueBind() throws Exception{
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        /**
         * 参数:
         * 队列名称
         * 交换机名称
         * 绑定路由器与交换器的路由键
         * 定义绑定一些参数
         */
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY+"_"+ 1,null);
    }


    /**
     * 发送消息
     *
     *
     */
    @Test
    public void sendMessage() throws Exception{
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY+"_"+ 1,null);
        String message = "hello world";

        AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder().contentType("text/plain");
        AMQP.BasicProperties basicProperties = builder.build();

        /**
         * 消息的基本属性
         * contentType 、contentEncoding 、headers(Map) 、
         * deliveryMode、priority、correlationld、correlationld、replyTo
         * expiration、messageld 、timestamp 、type 、userld 、appld 、clusterId
         *
         */
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY+"_"+ 1 ,basicProperties,message.getBytes());
    }

}

你可能感兴趣的:(MQ)