1、需要引入spring-boot-starter-amqp:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、进行相关的配置:
RabbitMQ配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
虚拟主机配置
spring.rabbitmq.virtual-host=/
开启发送端消息抵达Broker确认
spring.rabbitmq.publisher-confirms=true
开启发送端消息抵达Queue确认
spring.rabbitmq.publisher-returns=true
只要消息抵达Queue,就会异步发送优先回调returnfirm
spring.rabbitmq.template.mandatory=true
手动ack消息,不使用默认的消费端确认
spring.rabbitmq.listener.simple.acknowledge-mode=manual
3、使用,4个重要的注解:
(1)@AmqpAdmin:管理组件,可以用来声明交换机、队列、以及绑定交接机和队列
(2)RabbitTemplate:消息发送处理组件
(3)@RabbitListener 监听消息的方法可以有三种参数(不分数量,顺序):Object content, Message message, Channel channel ,可用于类上和方法上。
(4)@RabbitHandler 监听消息,用于方法上。
使用示例:
java
public class GulimallOrderApplicationTests {
public static final String EXCHANGE="hello-java-exchange";
public static final String QUEUE="hello-java-queue";
public static final String ROUTINGKEY="hello-java";
@Autowired
private AmqpAdmin amqpAdmin;
@Autowired
private RabbitTemplate rabbitTemplate;
//发送字符串对象消息
@Test
public void sengMessageStrTest(){
String message="Hello,RabbitMQ";
rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,message);
log.info("消息:{}发送完成",message);
}
//发送对象消息
@Test
public void sengMessageTest(){
OrderReturnReasonEntity returnReasonEntity = new OrderReturnReasonEntity();
returnReasonEntity.setName("hahaha");
returnReasonEntity.setId(1L);
returnReasonEntity.setCreateTime(new Date());
rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,returnReasonEntity);
log.info("消息:{}发送完成",returnReasonEntity);
}
@Test
public void sengMessageReceiveOnly(){
for (int i = 0; i < 10; i++) {
if(i%2==0){
OrderReturnReasonEntity returnReasonEntity = new OrderReturnReasonEntity();
returnReasonEntity.setName("hahaha:"+i);
returnReasonEntity.setId(1L);
returnReasonEntity.setCreateTime(new Date());
rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,returnReasonEntity);
log.info("消息:{}发送完成",returnReasonEntity);
}else{
OrderEntity order=new OrderEntity();
order.setOrderSn(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,order);
log.info("消息:{}发送完成",order);
}
}
}
@Test
void createExchange() {
DirectExchange directExchange = new DirectExchange(EXCHANGE, true, false);
amqpAdmin.declareExchange(directExchange);
log.info("exchange:{}创建成功",directExchange.getName());
}
@Test
void createQueue() {
Queue queue = new Queue(QUEUE, true, false,false);
amqpAdmin.declareQueue(queue);
log.info("队列:{}创建成功",queue.getName());
}
@Test
void createBinding(){
Binding binding = new Binding(QUEUE, Binding.DestinationType.QUEUE, EXCHANGE,ROUTINGKEY , null);
amqpAdmin.declareBinding(binding);
log.info("创建绑定成功");
}
}
监听接收消息:
java
@Service("orderService")
@RabbitListener(queues = {"hello-java-queue"})
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {
@RabbitHandler
public void receiveMessage(Message message, OrderReturnReasonEntity content, Channel channel) throws InterruptedException {
//接收到的消息体
byte[] body = message.getBody();
//MessageProperties properties = message.getMessageProperties();
System.out.println("接收到的消息:"+content);
//Thread.sleep(3000);
System.out.println("消息处理完成:"+content.getName());
}
@RabbitHandler
public void receiveMessage2(OrderEntity content) throws InterruptedException {
System.out.println("接收到的消息:"+content);
}
}
@RabbitListener 的@RabbitHandler可以组合使用,@RabbitListener用于类上,@RabbitHandler用于方法上,用于区分接收到不同消息或者不同队列的消息。