安装过程略
因为是直接在springboot项目中使用,所以选用了spring封装好的SpringBoot RabbirMQ Starter
- 导入依赖
我选用的springboot版本是2.7.2,所以这里rabbitmq也使用2.7.2版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.7.2</version>
</dependency>
- application.yml 中设置基本参数,在spring下加入如下,账号密码是RabbitMq官方默认的
spring:
rabbitmq:
host: localhost
port: 5672
password: guest
username: guest
新建一个专用的mq包
3. 构建生产者
这个最简单,也是后面加到具体业务代码里的,比如订单下单后,调用sendMessage传入单号,之后再到消费者代码中进行逻辑处理。
@Component
public class MyMessageProducer {
@Resource
private RabbitTemplate rabbitTemplate;
//绑定自定义命名的交换机名称和路由关键字
public void sendMessage(String message){
rabbitTemplate.convertAndSend("my_exchange","my_routingKey" ,message);
}
}
关于"my_exchange"和"my_routingKey",这里我使用的是Direct交换机模式
rabbitmq官方描述如下:https://www.rabbitmq.com/tutorials/tutorial-four-java
简单讲就是把交换机和队列进行关联,指定交换机把什么样的消息发给哪个队列,而routingKey就是把消息转发给指定的队列
说起来还没创建交换机和队列,运行mian函数,创建一下
public class BiMqInitMain {
public static void main(String[] args) {
try {
String EXCHANGE_NAME = "my_exchange";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
HashMap<String, Object> map = new HashMap<>();
//"x-message-ttl" 指定消息过期时间
map.put("x-message-ttl",90000);
Channel channel = connection.createChannel(); //队列1
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //这是交换机,通用的
String queueName = "my_queue";
channel.queueDeclare(queueName,true,false,false,map);
channel.queueBind(queueName, EXCHANGE_NAME, "my_routingKey");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
成功后进入http://localhost:15672可以看到创建的队列和交换机
- 构建消费者
@Component
@Slf4j
public class MyMessageConsumer {
//指定监听的消息队列和确认机制
@SneakyThrows
@RabbitListener(queues = "my_queue",ackMode = "MANUAL")
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long delivery_tag){
log.info("接受消息={}",message);
channel.basicAck(deliveryTag,false);
}
}
- 在生产者类页面按CTRL+shift+T创建MyMessageProducerTest测试用例
@SpringBootTest
class MyMessageProducerTest {
@Resource
private MyMessageProducer myMessageProducer;
@Test
void sendMessage() {
myMessageProducer.sendMessage("my_exchange","my_routingKey","this is a test");
}
}
运行即可
6. 具体到业务场景中就调用生产者传入信息
orderMessageProducer.sendMessage(String.valueOf(order.getId()));
再到消费者代码里写逻辑
@Component
@Slf4j
public class OrderMessageConsumer {
@SneakyThrows
@RabbitListener(queues = "my_queue",ackMode = "MANUAL")
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long delivery_tag){
log.info("接受消息={}",message);
/**
处理逻辑
**/
channel.basicAck(deliveryTag,false);
}
}