目录
1、需求
使用简单模式为例搭建环境完成消息传递
2、步骤
① 创建工程(生产者、消费者)
② 分别添加依赖
③ 编写生产者发送消息
④ 编写消费者接收消息
3、搭建工程实例
1.1、创建工程
① 创建生产者
② 创建消费者
1.2、添加依赖
<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>
1.3、编写生产者
/**
* 生产者:往消息中间件上发送消息
*/
public class Producer {
public static final String QUEUE_NAME = "simple_queue";//队列名称
public static void main(String[] args) throws Exception {
// 1、创建工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.137.118");
connectionFactory.setPort(5672);//AMQP协议
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
// 2、创建连接
Connection connection = connectionFactory.newConnection();
// 3、创建信道
Channel channel = connection.createChannel();
/**
* 4、声明队列
*
* queue :队列名称
* durable:如果是true,声明一个持久化队列。 (服务器重启队列是否存活)
* exclusive 如果是true,这个队列只限于当前连接使用。连接关闭,队列就删除了
* autoDelete 如果是true,则声明一个自动删除的队列。 (队列长时间不使用,服务器将删除它)
* arguments 队列的属性设置
*/
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
/**
* 5、发送消息
*
* exchange 将消息发布到哪个交换机,需要提供交换机名称。简单消息模型底层提供默认的交互机。
* routingKey 路由绑定名称。简单消息模型只需要设置队列的名称即可。
* props 消息属性配置。设置消息头信息等
* body 消息内容
*/
String msg = "Hello,Rabbit!";
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
// 6.关闭对象(信道)
channel.close();
connection.close();
}
}
在执行上述的消息发送之后;可以登录rabbitMQ的管理控制台,可以发现队列和其消息:
1.4、编写消费者
/**
* 消费者:从中间件中获取消息,处理信息
*/
public class Consumer1 {
public static final String QUEUE_NAME = "simple_queue";// 声明一个常量作为队列名(要求与生产者一样)
public static void main(String[] args) throws Exception {
// 1、创建工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.137.118");
connectionFactory.setPort(5672);//AMQP协议
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
//2.创建连接
Connection connection = connectionFactory.newConnection();
//3.创建信道
Channel channel = connection.createChannel();
//4、声明队列
/**
* 参数列表:
* 1、queue 队列名称
* 2、durable 如果是true,声明一个持久化队列。 (服务器重启队列是否存活)
* 3、exclusive 如果是true,这个队列只限于当前连接使用。连接关闭,队列就删除了。
* 4、autoDelete 如果是true,则声明一个自动删除的队列。 (队列长时间不使用,服务器将删除它)
* 5、arguments 队列的属性设置
*/
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//5、创建消费者消费信息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumerTag = " + consumerTag);
System.out.println("envelope.getDeliveryTag() = " + envelope.getDeliveryTag()); //相当于id
System.out.println("envelope.getExchange() = " + envelope.getExchange());
System.out.println("envelope.getRoutingKey() = " + envelope.getRoutingKey());
System.out.println("properties = " + properties);
System.out.println("body = " + new String(body));
}
};
/**
* 参数列表含义:
* 1、指定消费的队列
* 2、如果true表示消息一旦获取就直接确认。如果false表示消息需要手动确认。
* 3、回调方法(一旦确认就回调)
*/
channel.basicConsume(QUEUE_NAME, false, consumer);
//消费者无需关闭对象,一旦生产者来了信息随时处理
}
}
运行程序可发现,rabbitmq管理控制台的消息从队列上消失,消费者取出消息,并且控制台打印出消息