下面展示一些 内联代码片
。
public class WorkTest {
private static String queryname="WORK";
@Test
public void publish() throws IOException, TimeoutException {
//获取connection
Connection connection = RabbitMQUtil.getconnection();
//创建channel
Channel channel = connection.createChannel();
String msg="Hellow-Work!";
//参数1:queue - 指定队列的名称
//参数2:durable - 当前队列是否需要持久化(true)
//参数3:exclusive - 是否排外(conn.close() - 当前队列会被自动删除,当前队列只能被一个消费者消费)
//参数4:autoDelete - 如果这个队列没有消费者在消费,队列自动删除
//参数5:arguments - 指定当前队列的其他信息
channel.queueDeclare(queryname,true,false,false,null);
for (int i=0;i<100;i++){
channel.basicPublish("",queryname,null,(i+msg).getBytes());
}
//ps:exchange是不会帮你将消息持久化到本地 ,Queue才会帮你持久化信息
System.out.println("生产者发布消息成功");
//释放资源
channel.close();
connection.close();
}
@Test
public void consums1() throws IOException, TimeoutException {
//获得连接对象
Connection connection = RabbitMQUtil.getconnection();
//创建channel
Channel channel = connection.createChannel();
channel.queueDeclare(queryname,true,false,false,null);
//1 指定当前消费者,一次消费多少个消息 没有过来的消息 还在队列中保存 这样设置 不会造成消息丢失
// 因为 假如不指定 一次消费一条消息 就有可能有多条消息 到达消费者 此时消费者一旦宕机 到达消费者的消息也就丢了
// 所以 消息 从队列 到 消费者 一次来一条 免得 过来多条 消息在半路丢了
channel.basicQos(1); // 不要 一次性的把消息都给消费者 容易丢失 一次给一条 安全
//4. 开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel){
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者1号接受的消息:"+new String(body,"UTF-8"));
//2. 手动ack
// 参数1 long类型 标识队列中哪个具体的消息 参数2:boolean 类型 是否开启多个消息同时确认
//channel.basicAck(envelope.getDeliveryTag(),false);
// 处理完了消息 手动确认一下 队列再删除这个消息 这种机制保证消息永不丢失
// 队列给消费者 一条消息 消费者收到消息 处理完了之后 手动确认, 确认了之后 队列才把消息删除 保证消息永不丢失
// 而且 消费者 确认一个消息 队列发送一个消息 消费者确认的快 队列发送的快 能者多劳
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
//指定手动ack
channel.basicConsume(queryname,false,consumer);
System.out.println("消费者1开始监听队列");
System.in.read();
//释放资源
channel.close();
connection.close();
}
@Test
public void consume2() throws IOException, TimeoutException {
//1. 获取连接对象
Connection connection = RabbitMQUtil.getconnection();
//2. 创建channel
Channel channel = connection.createChannel();
//3. 声明队列-HelloWorld
//参数1:queue - 指定队列的名称
//参数2:durable - 当前队列是否需要持久化(true)
//参数3:exclusive - 是否排外(conn.close() - 当前队列会被自动删除,当前队列只能被一个消费者消费)
//参数4:autoDelete - 如果这个队列没有消费者在消费,队列自动删除
//参数5:arguments - 指定当前队列的其他信息
channel.queueDeclare(queryname,true,false,false,null);
//1 指定当前消费者,一次消费多少个消息
channel.basicQos(1);
//4. 开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者2号接收到消息:" + new String(body,"UTF-8"));
//2. 手动ack
// 参数1 long类型 标识队列中哪个具体的消息 参数2:boolean 类型 是否开启多个消息同时确认
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
//参数1:queue - 指定消费哪个队列
//参数2:autoAck - 指定是否自动ACK (true,接收到消息后,会立即告诉RabbitMQ)
//参数3:consumer - 指定消费回调
//3. 指定手动ack
channel.basicConsume(queryname,false,consumer);
System.out.println("消费者2开始监听队列!");
// System.in.read();
System.in.read();
//5. 释放资源
channel.close();
connection.close();
}
}