1:在spring boot 项目中引入Rabbit 的引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2:配置spring boot yml文件用于连接amq
spring:
rabbitmq:
host: mq服务器ip地址
port: 5672
username: admin
password: admin
3:配置Configuration用于操作MQ——发送消息
Exchange Type主要有fanout、direct、topic、headers四种
参考
3.1 direct
配置@Configuration
// 定义队列名
public static final String DIRECT_QUEUE_NAME = "direct_queue";
//交换机
public static final String DIRECT_EXCHANGE = "DirectExchange";
//direct 模式下需要绑定ROUTINGKEY
public static final String DIRECT_ROUTINGKEY = "direct";
依次新建QUEUE、EXCHANGE 并将两者绑定
//创建队列
@Bean
public Queue createDirectQueue() {
return new Queue(DIRECT_QUEUE_NAME);
}
//创建交换机
@Bean
DirectExchange directExchange(){
return new DirectExchange(DIRECT_EXCHANGE);
}
//绑定队列与交换机
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(createDirectQueue()).
to(directExchange()).
with(DIRECT_ROUTINGKEY);
}
调用
@Autowired
private AmqpTemplate amqpTemplate;
这个里边的方法,就可以发送消息了
public void sendDirectMsg(String msg){
amqpTemplate.convertAndSend(RabbitConfig.DIRECT_EXCHANGE,RabbitConfig.DIRECT_ROUTINGKEY,msg);
}
其余三种模式和这种差不多,参考上边参考连接中文章
注意:
direct、topic:这两种模式需要绑定ROUTINGKEY
fanout、headers 不需要
4:配置用于操作MQ——接收消息
这里只需要配置监听mq中的消息就可以了,使用@RabbitListener就可以达到效果,这里需要配置需要读取消息的交换机、队列(如果有ROUTINGKEY的需要配置)
@RabbitListener(
bindings =
{
@QueueBinding(value = @Queue(value = RabbitConfig.DIRECT_QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = RabbitConfig.DIRECT_EXCHANGE),
key = RabbitConfig.DIRECT_ROUTINGKEY)
})
public void processDirectMsg(Message massage) {
String msg = new String(massage.getBody(), StandardCharsets.UTF_8);
System.out.println("收到了消息"+massage);
}
这样,当我们启动项目后,当监听对应的队列中进入消息之后,就能获取到消息了
二:消息的确认模式
上述时间中,我们的RabbitListener会监控rabbitmq,当有符合的消息的时候会被自动读取,但是有时候我们更需要的是手工签收模式,就是当我们满足特定条件下才去从队列中读取并且删除这条消息,这时候我们需要修改一下我们的配置如下:
rabbitmq:
host: 47.110.33.145
port: 5672
username: admin
password: admin
#回调 P(生产者) -> Exchange
publisher-confirm-type: correlated
#回调路由到指定的队列
#publisher-returns: true
listener:
simple:
acknowledge-mode: manual
这里的listener就是配置为手工签收模式,现在我尝试推送消息到队列中的时候,监控页面如下:
这里显示有两条消息(运行了多次方法)未被消费
这时候再消费者累中添加手工签收的方法即可完成手工签收:
//手工签收
channel.basicNack(massage.getMessageProperties().getDeliveryTag(), false,false);