1、什么是RabbitMQ
MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据)、消费队列(从队列中取数据)。RabbitMQ就是基于消息队列的一个典型应用。RabbitMQ除了普通的生产消费功能,还有一些高级功能:公平分发 ,轮询分发,路由模式,通配符模式,发布订阅,队列持久化。
2、java实现RabbitMQ的连接
2.1、RabbitMQ客户端jar包
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.0.2</version> </dependency>
2.2、java连接RabbitMQ工具类
public class ConnectionUtil { private static Logger logger = Logger.getLogger(ConnectionUtil.class); public static Connection getConnection() { try { Connection connection = null; //定义一个连接工厂 ConnectionFactory factory = new ConnectionFactory(); //设置服务端地址(域名地址/ip) factory.setHost("127.0.0.1"); //设置服务器端口号 factory.setPort(5672); //设置虚拟主机(相当于数据库中的库) factory.setVirtualHost("/"); //设置用户名 factory.setUsername("admin"); //设置密码 factory.setPassword("888888"); connection = factory.newConnection(); return connection; } catch (Exception e) { return null; } } }
2.3、简单的生产者-消费者模式
下图取自于官方网站(RabbitMQ)的生产消费模式的工作图
P:消息的生产者
C:消息的消费者
红色:队列
生产者将消息发送到队列,消费者从队列中获取消息。
2.4、生产者(Send)
public class Send { //队列名称 private static final String QUEUE_NAME = "test_simple_queue"; public static void main(String[] args) { try { //获取连接 Connection connection = ConnectionUtil.getConnection(); //从连接中获取一个通道 Channel channel = connection.createChannel(); //声明队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "This is simple queue"; //发送消息 channel.basicPublish("", QUEUE_NAME, null, message.getBytes("utf-8")); System.out.println("[send]:" + message); channel.close(); connection.close(); } catch (IOException | TimeoutException e) { e.printStackTrace(); } } }运行结果:[send]:This is simple queue
2.5、消费者(Receive)
public class Receive { //队列名称 private static final String QUEUE_NAME = "test_simple_queue"; public static void main(String[] args) { try { //获取连接 Connection connection = ConnectionUtil.getConnection(); //从连接中获取一个通道 Channel channel = connection.createChannel(); //声明队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //定义消费者 DefaultConsumer consumer = new DefaultConsumer(channel) { //当消息到达时执行回调方法 @Override public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "utf-8"); System.out.println("[Receive]:" + message); } }; //监听队列 channel.basicConsume(QUEUE_NAME, true, consumer); } catch (IOException | ShutdownSignalException | ConsumerCancelledException e) { e.printStackTrace(); } } } 运行结果: [Receive]:This is simple queue
总结:简单的生产者-消费者模式实现了生产者向队列里生产数据,消费者启动后可以一直监听队列,不断的从队列里取出数据。
注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!
来源:https://www.cnblogs.com/wy697495/p/9611310.html