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<String,Object>) 、
* deliveryMode、priority、correlationld、correlationld、replyTo
* expiration、messageld 、timestamp 、type 、userld 、appld 、clusterId
*
*/
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY+"_"+ 1 ,basicProperties,message.getBytes());
}
}
RabbitMq_Producer 详解
最新推荐文章于 2024-09-10 13:21:22 发布