如下图,P就是生产者,C就是消费者,中间的框是一个队列-RabbitMQ 代表使用者保留的消息缓冲区
1.生产者代码
public class Producer {
//队列名称
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
//创建一个链接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂ip 链接rabbitmq
factory.setHost("192.168.204.101");
//用户名
factory.setUsername("admin");
//密码
factory.setPassword("123");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
/**
* 生成一个队列
* queueDeclare(String var1, boolean var2, boolean var3, boolean var4, Map<String, Object> var5)中参数讲解如下
* 1.队列名称
* 2.队列里的消息是否持久化(存在磁盘中) 默认存储在内存中
* 3.该队列是否只供一个消费者进行消费,是否进行消息共享,false可以多个消费者消费,true只能一个消费者消费
* 4.是否自动删除,最后一个消费者端开连接以后 该队列是否自动删除 true自动删除 false不自动删除
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//发消息
String message = "hello world";
/**
* 发送一个消息
* basicPublish(String var1, String var2, AMQP.BasicProperties var3, byte[] var4) 中参数讲解如下
* 1.发送到哪个交换机
* 2.路由的key值是哪个 本次是队列名称
* 3.其他参数信息
* 4.发送消息的消息体
*/
channel.basicPublish("",QUEUE_NAME,null, message.getBytes());
System.out.println("消息发送完毕");
}
}
控制台输出如下:
此时登录到RabbitMQ的页面,hello这个队列中就收到了消息
2.消费者代码
public class Consumer {
//队列名称
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂ip 链接rabbitmq
factory.setHost("192.168.204.101");
//用户名
factory.setUsername("admin");
//密码
factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明 接收消息
DeliverCallback deliverCallback = (consumerTag,message) ->{
System.out.println(new String(message.getBody()));
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag ->{
System.out.println("消息消费被中断");
};
/**
* 消费者消费消息
* basicConsume(String var1, boolean var2, DeliverCallback var3, CancelCallback var4)参数解释如下
* 1.消费哪个队列
* 2.消费成功后是否要自动答应 true代表自动答应 false代表手动答应
* 3.消费者未成功消费的回调 回调自己的方法
* 4.消费者取消消费的回调 回调自己的方法
*/
channel.basicConsume(QUEUE_NAME,true, deliverCallback, cancelCallback);
}
}
控制台输出:
此时刚才生产者生产的消息就被消费掉了
此时再重新启动消费者端发现控制台不再有输出
但是再重新启动生产者端会发现消费者端又可以重新收到消息
以上便是一个简单的使用RabbitMQ的例子