RabbitMQ与SpringBoot整合

RabbitMQ与SpringBoot整合

  • 一、生产端(producer)
    • 1、单元测试
  • 二、消费端(consumer)
    • 1、配置类
    • 2、测试用例

Springboot 版本

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>1.5.14.RELEASEversion>
        <relativePath/> 
    parent>

一、生产端(producer)

spring.rabbitmq.addresses=10.39.30.42:5672
spring.rabbitmq.username=fnuser
spring.rabbitmq.password=fnuser
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
#打开消息return机制  mandatory设为false时,路由失败 broker会直接将消息删除
spring.rabbitmq.template.mandatory=true

1、单元测试

    @Test
    public void sendMessage() throws Exception {
//        rabbitTemplate.setMessageConverter(new JsonMessageConverter());
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.err.println("---------confirm机制  当RabbitMQ接受到消息时 触发-------------");
                System.err.println("correlationData: " + correlationData);
                System.err.println("ack: " + ack);
                if(!ack){
                    System.err.println("原因: " + cause);
                    System.err.println("异常处理---- 补偿消息入库 等等");
                }
                System.err.println("-----------------------------------------------------");
            }
        });
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.err.println("---------消息return机制 消息路由队列失败 触发return监听-------------");
                System.err.println("exchange : " + exchange);
                System.err.println("routingKey : " + routingKey);
                System.err.println("回复码 replyCode : " + replyCode);
                System.err.println("回复信息 replyText : " + replyText);
                System.err.println("返回的消息 : " + message.toString());
                System.err.println("------------------------------------------------------------");

            }
        });
        //User 类 自行编写
        User user = new User();
        user.setId(1000L);
        user.setUsername("zhangsan");
        user.setAge(23);
        CorrelationData messageId = new CorrelationData(UUID.randomUUID().toString());
        //消息转换器 使用json序列化
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        rabbitTemplate.convertAndSend("test.exchange1","test.test",user,messageId);
        //此处睡眠 是为了保证监听能够正常运行
        Thread.sleep(1000);
    }

二、消费端(consumer)

spring.rabbitmq.addresses=10.39.30.42:5672
spring.rabbitmq.username=fnuser
spring.rabbitmq.password=fnuser
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

1、配置类

@Configurable
@Component
public class RabbitConsumerConfig {

    @Bean
    public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        #手动签收消息
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        #对消费者进行限流
        factory.setConcurrentConsumers(5);
        factory.setMaxConcurrentConsumers(10);
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        return factory;
    }
}

2、测试用例

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "test.queue1", durable = "true"),
            exchange = @Exchange(value = "test.exchange1", durable = "true", type = "topic"),
            key = "test.*")
    )
    @RabbitHandler
    public void handleMessage(@Payload User user, Channel channel,@Headers Map<String,Object> headers) throws IOException {
        System.err.println("----------消费端------------------");
        System.err.println("消息: " + user);

        Long deliveryTag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
        channel.basicAck(deliveryTag, true);
    }

    @Test
    public void test() throws IOException {
        //保证测试用例 一直运行
        System.in.read();
    }

你可能感兴趣的:(RabbitMQ与SpringBoot整合)