1.引用依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置RabbitMQ相关信息
spring:
#RabbitMQ相关配置
rabbitmq:
#配置虚拟主机名称
virtual-host: system1
#RabbitMQ管理端口号:15672;服务端口号:5672
port: 5672
#配置使用者的名称和密码
username: guest
password: guest
#配置消费者信息
listener:
simple:
#设置每个监听者只能获取一条消息,处理完成才能获取下一条消息;作用:能者多劳
prefetch: 1
3.设置生产者发送消息
package com.dds.util;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 完成发送消息功能
* @param exchangeName 交换机名称
* @param routingKey routingKey值
* @param message 消息内容
*/
public void sendMessage(String exchangeName,String routingKey,String message){
rabbitTemplate.convertAndSend(exchangeName,routingKey,message);
}
}
4.设置交换机,消息队列,routingKey值并使用消费者监听消费消息
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class RabbitListener {
//使用注解定义交换机,消息队列,routingKey值
@org.springframework.amqp.rabbit.annotation.RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "pay_queue"),//设置队列
exchange = @Exchange(name = "pay_exchange",type = ExchangeTypes.TOPIC),//设置交换机
key = {"pay.#"}//设置routingKey值,routingKey值有多个以数组的形式定义
))
public void pay(String message) throws InterruptedException {
System.out.println("支付模块处理的任务:"+message);
}
@org.springframework.amqp.rabbit.annotation.RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "order_queue"),//设置队列
exchange = @Exchange(name = "order_exchange",type = ExchangeTypes.TOPIC),//设置交换机
key = {"order.*"}//设置routingKey值,routingKey值有多个以数组的形式定义
))
public void order(String message) throws InterruptedException {
System.out.println("订单模块处理的任务:"+message);
}
}
6.消息转换器
如果发送的消息是引用对象则需要序列化,建议采用JSON序列化
(1)引用依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
(2)在生产者和消费者中配置MessageConverter
//如果生产者和消费者是两个服务,则两个服务都需要配置
@Bean
public Jackson2JsonMessageConverter jacksonmessageConverter(){
return new Jackson2JsonMessageConverter();
}