package com.rabbit.fisher.setqueue;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
* 控制队列的参数
*/
public class SetQueueConsumer {
private final static String EXCHANGE_NAME = "set_queue";
public static void main(String[] args) throws IOException, TimeoutException {
//创建链接、连接到MQ
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接工厂的连接地址(默认端口5672)
connectionFactory.setHost("192.168.42.111");
//设置虚拟主机
connectionFactory.setVirtualHost("fisher");
//设置用户名
connectionFactory.setUsername("fisher");
//设置密码
connectionFactory.setPassword("123456");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//在信道中设置交换器(这里选择直接交换器direct)
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//申明队列 /*自动过期队列,需要Map传递参数*/
String queueName = "setQueue";
Map<String, Object> map = new HashMap<>();
map.put("x-expires", 10 * 1000);//10秒后被删除(自动过期)
//b:true表示持久化,false表示非持久化;
//b1:true表示单消费者队列(对于队列setQueue,以及此channel,只有这个消费者可以消费里面的消息),false表示非单消费者队列;
//b2:true表示自动删除(消费者断开就删除),false表示非自动删除
channel.queueDeclare(queueName, false, false, false, map);
//绑定:将队列(queue-fisher)与交换器通过路由键绑定(rabbit)
String routeKey = "rabbit";
channel.queueBind(queueName, EXCHANGE_NAME, routeKey);
System.out.println("waiting for message ......");
//申明一个消费者
final 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("Receive[" + envelope.getRoutingKey() + "]" + message);
}
};
channel.basicConsume(queueName, true, consumer);
}
}
临时队列(非持久化的队列)
自动删除队列
消费者断开之后,队列会自动删除
单消费者队列
对于队列setQueue,以及此channel,只有这个消费者可以消费里面的消息,消息不会轮询
自动过期队列
1.队列没有get操作,2.队列没有consumer连接,10秒后队列会被删除
永久队列(持久化的队列)
持久化队列因为每发送一条消息,就会向磁盘内同步一条消息,性能比临时队列低