springboot整合rabbitMQ实现批处理

1,015 阅读1分钟

springboot整合rabbitMQ实现批处理

在mq开发环境下,mq数据联通测试通过。
推荐:开启后,如果业务逻辑入库操作为插入数据,数据库同时做批处理,可以大大提高内存利用率,

步骤一:引入依赖

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

步骤二:编辑yml文件

rabbitmq:
    host: localhost
    port: 5672
    virtual-host: /
    username: guest
    password: guest
    publisher-confirms: true

步骤三:配置MQConfig配置:基于路由模式

/**
 * rabbitMQ配置类
 */
@Configuration
public class RabbitConfig {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean
    DirectExchange orderDirect() {
        return (DirectExchange) ExchangeBuilder
                .directExchange(QueueEnum.QUEUE_ORDER_CANCEL.getExchange())
                .durable(true)
                .build();
    }

    /**
     * 延迟队列队列所绑定的交换机
     */
    @Bean
    DirectExchange orderTtlDirect() {
        return (DirectExchange) ExchangeBuilder
                .directExchange(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getExchange())
                .durable(true)
                .build();
    }

    /**
     * 实际消费队列
     */
    @Bean
    public Queue orderQueue() {
        return new Queue(QueueEnum.QUEUE_ORDER_CANCEL.getName());
    }

    /**
     * 延迟队列(死信队列)
     */
    @Bean
    public Queue orderTtlQueue() {
        return QueueBuilder
                .durable(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getName())
                .withArgument("x-dead-letter-exchange", QueueEnum.QUEUE_ORDER_CANCEL.getExchange())//到期后转发的交换机
                .withArgument("x-dead-letter-routing-key", QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey())//到期后转发的路由键
                .build();
    }

    /**
     * 将队列绑定到交换机
     */
    @Bean
    Binding orderBinding(DirectExchange orderDirect,Queue orderQueue){
        return BindingBuilder
                .bind(orderQueue)
                .to(orderDirect)
                .with(QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey());
    }

    /**
     * 将延迟队列绑定到交换机
     */
    @Bean
    Binding orderTtlBinding(DirectExchange orderTtlDirect,Queue orderTtlQueue){
        return BindingBuilder
                .bind(orderTtlQueue)
                .to(orderTtlDirect)
                .with(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey());
    }
    @Bean("customContainerFactory")
    public SimpleRabbitListenerContainerFactory customContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setBatchListener(true);//开启批处理监听
        factory.setConsumerBatchEnabled(true);//开启批处理
        factory.setConcurrentConsumers(16);  //设置线程数
        factory.setMaxConcurrentConsumers(16); //最大线程数
        factory.setBatchSize(500);//每次从队列中取出的数据量,
        configurer.configure(factory, connectionFactory);
        return factory;
    }

}

步骤四:提供者调用:

amqpTemplate.convertAndSend(参数一,参数二,参数三),
参数一:一为Exchange,路由通道
参数二:二位queue,队列
参数三:发送到MQ的业务数据

步骤五:消费者调用:

@Component 
public class MornitorConsumer {
    @RabbitListener(queues = "morinitor.center.cancel.ttl", containerFactory = "customContainerFactory")   // 指定监听的队列名,注意containerFactory名称与配置名称一致
    public void showMSG1(List<Map<Date, String>> list) {
    	//消息处理,逻辑操作。
      }
    }