消息中间件RabbitMQ26_RabbitMQ快速入门3
一、入门程序
需求:使用简单模式完成消息传递
步骤:
1. 创建工程(生成者、消费者)
2. 分别添加依赖
3. 编写生产者发送消息
4. 编写消费者接收消息
实现:
1. 先创建一个空项目:rabbitmq,然后在rabbitmq下创建两个module(maven工程):rabbitmq-producer和rabbitmq-consumer
2. 两个工程都添加依赖
<dependencies> <!--rabbitmq java 客户端--> <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>
3. 编写生产者发送消息
package com.itheima.producer; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * 发送消息 */ public class Producer_HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1、创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2、设置参数 factory.setHost("192.168.240.132");//ip 默认值是localhost factory.setPort(5672);//端口 默认值是5672 factory.setVirtualHost("/itcast");//虚拟机 默认值是/ factory.setUsername("heima");//用户名 默认值是guest factory.setPassword("heima");//密码 默认值是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) * 参数: * queue:队列名称 * durable:是否持久化,当mq重启之后,还在 * exclusive:是否独占。 * 只能有一个消费者监听这个队列; * 当Connection关闭时,是否删除队列 * autoDelete:是否自动删除。当没有Consumer时,自动删除掉 * arguments:参数。 */ //如果没有一个名字叫hello_world的队列,则会创建该队列,如果有则不会创建 channel.queueDeclare("hello_world",true,false,false,null); //6、发送消息给Queue /** * (String exchange, String routingKey, BasicProperties props, byte[] body) * 参数: * exchange:交换机名称。简单模式下交换机会使用默认的 "" * routingKey:路由名称。使用默认的交换机则要跟队列名称一致 * props:配置信息 * body:发送的消息数据 */ String body ="hello rabbitmq..."; channel.basicPublish("","hello_world",null,body.getBytes()); //7、释放资源 channel.close(); connection.close(); } }
执行生产者,检查rabbitMQ管控台:
Connections和Channel都为0因为最后释放了资源,Queue中有1条消息未被消费,消费者数量为0
不释放资源(把最后两行代码注释掉),重新执行那么Connections和Channel就会有数据,Queue中有2条消息
4. 编写消费者接收消息
package com.itheima.consumer; import com.rabbitmq.client.*; import java.io.IOException; public class Consumer_HelloWorld { public static void main(String[] args) throws Exception{ //1、创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2、设置参数 factory.setHost("192.168.240.132");//ip 默认值是localhost factory.setPort(5672);//端口 默认值是5672 factory.setVirtualHost("/itcast");//虚拟机 默认值是/ factory.setUsername("heima");//用户名 默认值是guest factory.setPassword("heima");//密码 默认值是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) * 参数: * queue:队列名称 * durable:是否持久化,当mq重启之后,还在 * exclusive:是否独占。 * 只能有一个消费者监听这个队列; * 当Connection关闭时,是否删除队列 * autoDelete:是否自动删除。当没有Consumer时,自动删除掉 * arguments:参数。 */ //如果没有一个名字叫hello_world的队列,则会创建该队列,如果有则不会创建 channel.queueDeclare("hello_world",true,false,false,null); //6、接收消息 /** * basicConsume(String queue, boolean autoAck, Consumer callback) * 参数: * queue:队列名称 * autoAck:是否自动确认 * callback:回调对象 */ Consumer consumer=new DefaultConsumer(channel){ /** * 回调方法,当收到消息后会自动执行该方法 * consumerTag:标识 * envelope:获取一些信息,交换机,路由key... * properties:配置信息 * 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); //关闭资源?不要 } }
控制台停掉发送者执行,执行消费者,控制台输出2条一样的信息,因为发送者发送了2条消息,消费者都接收了
查看RabbitMQ管控台:发送者发送的消息变成0,Consumers个数为1
二、小结
上述的入门案例中其实使用的是如下的简单模式:
在上图的模型中,有以下概念:
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接收者,会一直等待消息到来
- queue:消息队列,图中黄色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息