SpringBoot整合RabbitMQ

212 阅读1分钟

下载

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置

rabbitmq服务器没有收到ack回复后,每次消费者离线都会将失败的消息重新入队列

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.max-attempts=3
spring.rabbitmq.listener.simple.acknowledge-mode=manual

配置类

@Configuration
public class QueueConfig {

    @Bean
    public CustomExchange customerExchange() {
        return new CustomExchange("customerExchange", "direct", true, false);
    }
    
    @Bean
    public Queue customerQueue() {
        return new Queue("customerQueue");
    }
    
    @Bean
    public Binding binding(@Qualifier("customerQueue") Queue queue,
                           @Qualifier("customerExchange") CustomExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("customer_behavior").noargs();
    }
    
}

生产者

@Resource
private RabbitTemplate rabbitTemplate;

@RequestMapping("sendMessage")
@ResponseBody
public void sendMessage(String msg) {
	Map<String, Object> params = new HashMap<>();
	params.put("code", 1);
	params.put("msg", msg);
	rabbitTemplate.convertAndSend("customerExchange", "customer_behavior", JSON.toJSONString(params));
}

消费者

@Component
@RabbitListener(queues = "demoQueue")
public class Consumer {

    @RabbitHandler
    public void queueHandle(String queueMessage, @Headers Map<String, Object> headers, Channel channel) throws IOException {
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
        System.out.println("=====>" + queueMessage);

        // 确认消息
        channel.basicAck(deliveryTag,false);
    }
}