前言
RabbitMQ是消息代理:它接受并转发消息。您可以将其视为邮局:将要发布的邮件放在邮箱中时,可以确保邮件代理人最终发给收件人。以此类推,RabbitMQ是一个邮箱,一个邮局和一个邮递员。
RabbitMQ与邮局之间的主要区别在于,它不处理纸张,而是接收,存储和转发数据消息的二进制中转站
在下图中,“ P”是我们的生产者,“ C”是我们的消费者。中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区。
简单队列,是RabbitMQ中最简单的一种工作队列模式,也叫点对点模式。它有三个角色,一个生产者,一个队列,一个消费者。理解起来也比较简单!由于是一对一的工作模式,它的缺点也很明显,如果在实际的应用中,业务处理比较耗费时间,那么单队列模式很难在并发环境下支撑。
一、引入RabbitMQ开发包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.6</version>
</dependency>
二、连接工具
package com.example.demo.util;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消息队列连接工具
*
*/
public class MQConnectionUtils {
public static Connection connection() throws IOException, TimeoutException{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
return factory.newConnection();
}
}
三、生产者
package com.example.demo.produce;
import com.example.demo.util.MQConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 简单模式 - 生产者
*
*/
public class SimpleProduce {
private static final String SIMPLE_QUEUE_NAME = "simple_queue_name";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MQConnectionUtils.connection();
Channel channel = connection.createChannel();
// 声明一个队列
channel.queueDeclare(SIMPLE_QUEUE_NAME, false,false,false,null);
String msg = "hello,我是简单模式-生产者!";
channel.basicPublish("", SIMPLE_QUEUE_NAME, null, msg.getBytes());
channel.close();
connection.close();
}
}
四、消费者
package com.example.demo.consume;
import com.example.demo.common.Constant;
import com.example.demo.util.MQConnectionUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 简单模式 - 消费者
*/
public class SimpleConsume {
private static final String SIMPLE_QUEUE_NAME = "simple_queue_name";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MQConnectionUtils.connection();
Channel channel = connection.createChannel();
channel.queueDeclare(SIMPLE_QUEUE_NAME,false,false, false,null);
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumeTag, Envelope envelope, AMQP.BasicProperties basicProperties, byte[] body)
throws IOException{
String msg = new String(body, "utf-8");
System.out.println("收到的消息为:<" + msg + ">");
}
};
channel.basicConsume(SIMPLE_QUEUE_NAME,true,consumer);
}
}
五、启动服务