两个项目中配置相同的 rabbitmq 主机, 在application.propertes文件中配置
#rabbitmq
# 配置虚拟机
spring.rabbitmq.virtual-host=/
# 开启消息确认机制 confirm 异步
spring.rabbitmq.publisher-confirm-type=correlated
# 之前的旧版本 开启消息确认机制的方式
# spring.rabbitmq.publisher-confirms=true
# 开启return机制
spring.rabbitmq.publisher-returns=true
# 消息开启手动确认
spring.rabbitmq.listener.direct.acknowledge-mode=auto
spring.rabbitmq.listener.simple.acknowledge-mode=auto
spring.rabbitmq.host=192.168.0.107
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
1. 消息提供者项目 boot-rabbitmq-provider
RabbitmqConfig.java 配置类
package com.hejjon.rabbitmq.config;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
/**
* @author: caoshi
* @date: 2022/5/23 17:00
*/
@SpringBootConfiguration
public class RabbitmqConfig {
// 配置一个工作模型队列
@Bean
public Queue queueWork1() {
return new Queue("queue_work");
}
}
发送消息的业务 RabbitmqServiceImpl.java
package com.hejjon.rabbitmq.service.impl;
import com.hejjon.rabbitmq.service.IRabbitmqService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author: caoshi
* @date: 2022/5/23 17:04
*/
@Service
public class RabbitmqServiceImpl implements IRabbitmqService {
private static Logger logger = LoggerFactory.getLogger(RabbitmqServiceImpl.class);
@Resource
private RabbitTemplate rabbitTemplate;
@Override
public void sendwork() {
logger.info("消息提供者开始发送消息...");
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend("queue_work", "测试work模型的消息内容..." + i);
}
}
}
controller层触发 发消息
package com.hejjon.rabbitmq.controller;
import com.hejjon.rabbitmq.service.IRabbitmqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: caoshi
* @date: 2022/5/23 16:51
*/
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private IRabbitmqService rabbitmqService;
/**
* 触发消息提供者发送消息
* @return
*/
@GetMapping("/sendWork")
public String sendWork() {
rabbitmqService.sendwork();
return "success";
}
}
2. 消息消费者项目 boot-rabbitmq-consumer
写一个监听器类 WorkReceiveListener.java
package com.hejjon.listener;
import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @author: caoshi
* @date: 2022/5/24 8:53
*/
@Component
public class WorkReceiveListener {
private static Logger logger = LoggerFactory.getLogger(WorkReceiveListener.class);
@RabbitListener(queues = {"queue_work"})
public void receiveMessage(String msg, Channel channel, Message message) {
logger.info("{}", msg);
}
}
至此代码编写完成
测试触发消息提供者发送消息, 消息消费者可以接收到消息 .
注意: 这仅仅是测试demo, 没有保证消息幂等性等问题. 只是将消费者和提供者分在了不同的项目里