一、入门程序
需求:使用简单模式完成消息传递
1.创建工程
创建空工程,命名为:rabbitmq
在工程里添加两个maven模块:rabbitmq-producer(生产者)、rabbitmq-consumer(消费者)
在两个工程里的pom文件分别加入maven依赖
<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>
2.生产者配置
在生产者模块下创建一个HelloWorld类
编写生产者代码然后运行
package com.ailuti.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 HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1.创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2.设置参数 factory.setHost("10.40.94.18"); //IP地址,默认值:localhost factory.setPort(5672); //端口,默认5672 factory.setVirtualHost("itcast"); //你新建的虚拟机,默认/根目录 factory.setUsername("xxx"); //用户名,默认guest factory.setPassword("xxx"); //密码,默认guest //3.创建连接 Connection connection = factory.newConnection(); //4.创建Channel Channel channel = connection.createChannel(); //5.创建队列 //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.发送消息 //参数: //basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) //exchange: 交换机名称,简单模式下使用“” //routingKey:路由器名称,和队列名称写一样会自动绑定 //props:配置信息 //body: 发送的消息数据 String body= "你好,我是生成者~"; channel.basicPublish("","hello_world",null,body.getBytes()); //7.释放资源 channel.close(); connection.close(); } }
如果代码没有报错,再回到rabbitmq管理界面查看Queues(队列),可以看到已经成功创建出来了
3.消费者配置
在消费者模块下创建一个HelloWorld类
编写消费者代码然后运行
package com.ailuti.consumer; import com.rabbitmq.client.*; import java.io.IOException; import java.util.concurrent.TimeoutException; public class HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1.创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2.设置参数 factory.setHost("10.40.94.18"); //IP地址,默认值:localhost factory.setPort(5672); //端口,默认5672 factory.setVirtualHost("itcast"); //虚拟机,默认/根目录 factory.setUsername("xxx"); //用户名,默认guest factory.setPassword("xxx"); //密码,默认guest //3.创建连接 Connection connection = factory.newConnection(); //4.创建Channel Channel channel = connection.createChannel(); //5.创建队列 //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); //5.接收消息 Consumer consumer = new DefaultConsumer(channel){ /** * 回调方法,当收到消息后,会执行该方法 * @param consumerTag 消息标识 * @param envelope 获取对应的信息,交换机信息...路由key信息... * @param properties 配置信息 * @param body 接收到的真实数据 * @throws IOException */ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("consumerTag:"+consumerTag); System.out.println("envelope:"+envelope.getExchange()+"----"+envelope.getRoutingKey()); System.out.println("properties:"+properties); System.out.println("body:"+ new String(body)); } }; //basicConsume(String queue, boolean autoAck, Consumer callback) //参数: //queue:队列名称 //autoAck :是否自动确认 //callback : 回调对象 channel.basicConsume("hello_world",true,consumer); //最后不要关闭资源,关闭了没办法接收生产者消息 } }
如果代码没有报错,会在控制台输出生产者给出的消息信息
二、总结
在简单模式下其实使用的是如下:
在上图模型中,有以下概念
- P : producer(生产者),也就是要发送消息的程序
- C:consumer(消费者),也就是要接收消息的程序,会一直等待消息的到来
- 图中红色部分:queue(消息队列),类似一个邮箱,可以缓存消息;生产者向其投送消息,消费者从中获取消息
文章评论