RabbitMQ介绍
AMQP
RabbitMQ基于AMQP,即Advanced Message Queuing protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类比HTTP。
RabbitMQ简介
2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ1.0发布。RabbitMQ采用Erlang语言开发。Erlang语言由Ericson设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
RabbitMQ基础架构如下图:
RabbitMQ概念
RabbitMQ6种工作模式
RabbitMQ提供了6种工作模式:简单模式、work queues、Publish/Subscribe发布与订阅模式、Routing路由模式、Topics主体模式、RPC远程调用模式(远程调用不太算MQ)
JMS
- JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
- JMS是JavaEE规范中的一种,类比JDBC
- 很多消息中间件都实现了JMS规范,但是RabbitMQ官方没有提供JMS的实现包,但是开源社区有提供
RabbitMQ快速入门
步骤:
-
创建工程(生产者、消费者)
-
分别添加依赖
<dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.6.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
-
生产者发送消息
/** * 生产者,发送消息 */ public class Producer_HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1.连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2.设置参数 //2.1设置IP地址,默认值为localhost factory.setHost("192.168.23.129"); //2.2设置端口,默认值5672 factory.setPort(5672); //2.3设置虚拟机,默认值为/ factory.setVirtualHost("/zhenbao"); //2.4设置账号密码 factory.setUsername("qiyun");//默认guest factory.setPassword("qiyun");//默认guest //3.获取连接 Connection Connection connection = factory.newConnection(); //4.创建Channel Channel channel = connection.createChannel(); //5.创建队列Queue /** * * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) * 参数: * 1.queue:队列名称 * 2.durable:是否持久化,当mq重启之后还在 * 3.exclusive: * *是否独占,只能有一个消费者监听这队列 * *当Connection关闭时,是否删除队列 * 4.autoDelete:是否自动删除,当没有Consumer时,自动删除掉 * 5.arguments:参数 */ //如果没有一个名字叫hello_world的队列,则会自动创建,有就不会创建 channel.queueDeclare("hello_world",true,false,false,null); //6.发送消息给Queue /** * basicPublish(String exchange, String routingKey,BasicProperties props, byte[] body) * 参数: * 1.exchange:交换机名称,简单模式下交换机会使用默认的 * 2.routingKey:路由名称 * 3.props:配置信息 * 4.body:发送消息数据 */ String body ="hello RabbitMQ~~~~~~~~~"; channel.basicPublish("","hello_world",null,body.getBytes()); //7.释放资源 channel.close(); connection.close(); } }
-
消费者接收消息
/**
* 消费者,接收消息
*/
public class Consumer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
//1.连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置参数
//2.1设置IP地址,默认值为localhost
factory.setHost("192.168.23.129");
//2.2设置端口,默认值5672
factory.setPort(5672);
//2.3设置虚拟机,默认值为/
factory.setVirtualHost("/zhenbao");
//2.4设置账号密码
factory.setUsername("qiyun");//默认guest
factory.setPassword("qiyun");//默认guest
//3.获取连接 Connection
Connection connection = factory.newConnection();
//4.创建Channel
Channel channel = connection.createChannel();
//5.创建队列Queue
/**
*
* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
* 参数:
* 1.queue:队列名称
* 2.durable:是否持久化,当mq重启之后还在
* 3.exclusive:
* *是否独占,只能有一个消费者监听这队列
* *当Connection关闭时,是否删除队列
* 4.autoDelete:是否自动删除,当没有Consumer时,自动删除掉
* 5.arguments:参数
*/
//如果没有一个名字叫hello_world的队列,则会自动创建,有就不会创建
channel.queueDeclare("hello_world",true,false,false,null);
//6.接收消息
/**
* public String basicConsume(String queue, boolean autoAck, Consumer callback)
* 参数:
* 1.queue:队列名称
* 2.autoAck:是否自动确认
* 3.callback:回调对象
*/
Consumer consumer = new DefaultConsumer(channel){
/*
* 这是一个回调方法,当收到消息过后,会自动执行该方法
* 参数:
* 1.consumerTag:标识
* 2.envelope:获取对应的信息(交换机、路由Key......)
* 3.properties:配置信息
* 4.body:数据
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumerTag:"+consumerTag);
System.out.println("Exchange:"+envelope.getExchange());
System.out.println("RoutingKey:"+envelope.getRoutingKey());
System.out.println("properties:"+properties);
System.out.println("body:"+new String(body));
}
};
channel.basicConsume("hello_world",true,consumer);
//消费者不能关闭资源
}
}