消费者
1)创建连接
2)创建通道
3)声明队列
4)监听队列
5)接收消息
6 )ack回复
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消费者
*
* @author Renes
* @create 2018-11-21 23:10
*/
public class Consumer01 {
private static final String QUEUE = "helloworld";
public static void main(String[] args) throws IOException, TimeoutException {
//也需要和mq创建连接,通道
//生产者和mq建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置参数
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);//端口
connectionFactory.setUsername("guest");//登陆名
connectionFactory.setPassword("guest");//密码
//设置虚拟机 一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mq
connectionFactory.setVirtualHost("/");
Connection connection = null;
connection = connectionFactory.newConnection();
//也需要声明队列
Channel channel = connection.createChannel();
//声明队列
//java.lang.String queue, boolean durable, boolean exclusive, boolean autoDelete, java.util.Map<java.lang.String,java.lang.Object> arguments
/**
* 参数明细
* 1、队列名称
* 2、durable 是否持久化 如果持久化,将mq重启后还在
* 3、exclusive 排他,是否独占连接,队列只允许在该连接中访问,如果连接关闭,自动删除,如果将此参数设置为true,可用于临时队列的创建
* 4、autoDelete 自动删除,队列不再使用时,自动删除,此参数和exclusive 设置为true时,就可以创建临时队列(队列不用了就自动删除)
* 5、arguments 设置队列的扩展参数,可以设置存活时间等。
*/
channel.queueDeclare(QUEUE, true, false, false, null);
//需要监听mq
/**
* 监听队列String queue, boolean autoAck,Consumer callback
* 参数明细
* 1、队列名称
* 2、是否自动回复,设置为true为表示消息接收到自动向mq回复接收到了,mq接收到回复会删除消息,设置
为false则需要手动回复
* 3、消费消息的方法,消费者接收到消息后调用此方法
*/
//消费方法
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
//当接收到消息后,此方法将被调用
/**
* @param consumerTag 消费者标签 可以再监听队列时设置channel.basicConsume
* @param envelope 信封,可以拿到交换机ExChange 消息ID
* @param properties
* @param body
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
super.handleDelivery(consumerTag, envelope, properties, body);
String exchange = envelope.getExchange();//交换机
long deliveryTag = envelope.getDeliveryTag();//消息ID
//消息内容
String message = new String(body, "utf-8");
System.out.println("receive message:" + message);
}
};
channel.basicConsume(QUEUE, true, defaultConsumer);
}
}
当生产者创建一条消息是,消费者就会立马消费掉,(消费者需要保持监听状态),如果断开连接,会将消息存放到MQ中。控制台打印receive message hello world