java中rabbitmq 的使用-测试篇
1.获取Connection
public static Connection getConnection() { // 创建Connection工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("your rabbitmq servier ip");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("yangzhtest"); // 创建Connection
Connection conn = null;
try {
conn = factory.newConnection();
} catch (Exception e) {
e.printStackTrace();
}// 返回
return conn;
}
2.生产者
在生产者中创建 交换机,所有对列,绑定Routing key,可以避免在没有消费者绑定队列的情况下,发送的消息丢失。(这个看业务决定在何处创建交换机、队列等)
@Test
public void publish() throws Exception {
// 配置
String queneName = "HelloWorld";
String exchangeName = "myexchage-direct-test";
String routingKey = "router.helloworld";
//1. 获取Connection
Connection connection = RabbitMQClientTest.getConnection();
//2. 创建Channel
Channel channel = connection.createChannel(); //3. 发布消息到exchange,同时指定路由的规则
String msg = "Hello-World!";
// 参数1:指定exchange,使用""。
// 参数2:指定路由的规则,使用具体的队列名称。
// 参数3:指定传递的消息所携带的properties,使用null。 /
// 参数4:指定发布的具体消息,byte[]类型
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT); // 绑定交换机,没有则创建
//3. 开启confirm机制
channel.confirmSelect();
// 发送消息持久化
// 声明默认的队列(也可不申明队列,使用默认队列)
//参数1:queue - 指定消费者监听队列名称
//参数2:durable -当前队列是否需要持久化
//参数3:exclusive -当前队列只能被一个消费者消费
//参数4:autoDelete -如果这个队列没有消费者消费,队列自动删除
//参数5:arguments -其他信息
channel.queueDeclare(queneName, true, false, false, null); // 创建队列
// String queue = channel.queueDeclare().getQueue();
// 将队列与交换机绑定
channel.queueBind(queneName, exchangeName, routingKey); //绑定routingkey
// 发送消息
channel.basicPublish("myexchage-direct-test", routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());// 发送消息
// Ps:exchange是不会帮你将消息持久化到本地的,Queue才会帮你持久化消息。
if (channel.waitForConfirms()) {
System.out.println("生产者发布消息成功!");
}
//4. 释放资源
channel.close();
connection.close();
}
3.消费者
// 消费者
@Test
public void consume() throws Exception {
String queneName = "HelloWorld";
String exchangeName = "myexchage-direct-test";
String routingKey = "router.helloworld";
Channel channel = null;
try {
// 获取链接对象
Connection connection = RabbitMQClientTest.getConnection();
// 创建channel
channel = connection.createChannel();
// 声明交换机类型
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT); // 不指定使用默认交换机
// 声明默认的队列(也可不申明队列,使用默认队列)
//参数1:queue - 指定消费者监听队列名称
//参数2:durable -当前队列是否需要持久化
//参数3:exclusive -当前队列只能被一个消费者消费
//参数4:autoDelete -如果这个队列没有消费者消费,队列自动删除
//参数5:arguments -其他信息
channel.queueDeclare(queneName, true, false, false, null);
// String queue = channel.queueDeclare().getQueue();
// 将队列与交换机绑定
channel.queueBind(queneName, exchangeName, routingKey);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(envelope.getExchange() + "," + envelope.getRoutingKey() + "," + message);
}
};
// channel绑定队列、消费者,autoAck为true表示一旦收到消息则自动回复确认消息
channel.basicConsume(queneName, true, consumer);
} catch (Exception ex) {
ex.printStackTrace();
}
}