springboot整合mq(多个队列),失败重试,多消费者

1.添加mq的依赖,这里使用的是activemq

<!--mq-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2.配置yml

spring.activemq.broker-url=tcp://172.16.154.27:61616
spring.activemq.user=admin
spring.activemq.password=123456
spring.activemq.in-memory=true
spring.activemq.pooled=false

3.添加配置文件整合mq

@Configuration
public class ActiveMQConfig {
    
    
    @Bean
    public JmsListenerContainerFactory<?> queueListenerFactory(@Qualifier("activeMQConnectionFactory") ActiveMQConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        SimpleMessageListenerContainer container=new SimpleMessageListenerContainer();
        container.setConcurrentConsumers(3);
        container.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        factory.setConnectionFactory(connectionFactory);
        factory.setConcurrency("3-15");  //连接数
        factory.setRecoveryInterval(1000L); //重连间隔时间
        factory.setSessionAcknowledgeMode(4);
        return factory;
    }

    @Bean
    public ActiveMQConnectionFactory activeMQConnectionFactory(){
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setTrustAllPackages(true);
        connectionFactory.setRedeliveryPolicy(redeliveryPolicy());
        return connectionFactory;
    }

    @Bean
    public RedeliveryPolicy redeliveryPolicy(){
        RedeliveryPolicy redeliveryPolicy=new RedeliveryPolicy();
        //是否在每次尝试重新发送失败后,增长这个等待时间
        redeliveryPolicy.setUseExponentialBackOff(true);
        //重发次数,默认为6次
        redeliveryPolicy.setMaximumRedeliveries(5);
        //重发时间间隔,默认为1秒
        redeliveryPolicy.setInitialRedeliveryDelay(1);
        //第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value
        redeliveryPolicy.setBackOffMultiplier(2);
        //是否避免消息碰撞
        redeliveryPolicy.setUseCollisionAvoidance(false);
        //设置重发最大拖延时间-1 表示没有拖延只有UseExponentialBackOff(true)为true时生效
        redeliveryPolicy.setMaximumRedeliveryDelay(-1);
        return redeliveryPolicy;
    }

    @Bean
    public JmsTemplate jmsTemplate(ActiveMQConnectionFactory activeMQConnectionFactory){
        JmsTemplate jmsTemplate=new JmsTemplate();
        jmsTemplate.setDeliveryMode(1);//进行持久化配置 1表示非持久化,2表示持久化
        jmsTemplate.setConnectionFactory(activeMQConnectionFactory);
        jmsTemplate.setSessionAcknowledgeMode(4);//客户端签收模式
        return jmsTemplate;
    }

}

4.定义queue

@Configuration
public class QueueConfig {


    @Bean(name="telQueue")
    public Queue telQueue() {
        return new ActiveMQQueue(MESSAGE_TEL);
    }

    @Bean(name = "emailQueue")
    public Queue emailQueue() {
        return new ActiveMQQueue(MESSAGE_EMAIL);
    }

}

5.定义生成者和消费者

@Slf4j
@Component
public class QueueSender {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Resource(name = "telQueue")
    private Queue telQueue;

    @Resource(name = "emailQueue")
    private Queue emailQueue;

    public void sendTel(final MessageTel message){
        log.info("发送短信message={}",message);
        this.jmsMessagingTemplate.convertAndSend(telQueue,message);
    }

    public void sendEmail(final MessageEMail message){
        log.info("发送email message={}",message);
        this.jmsMessagingTemplate.convertAndSend(emailQueue,message);
    }

}
@Slf4j
@Component
public class QueueReceiver {
   
    @Autowired
    private MailUtil mailUtil;
    @Autowired
    private SendSMSUtil sendSMSUtil;


    /**
     * 发送短信
     *
     * @param messageTel
     */
    @JmsListener(destination = QueueConfig.MESSAGE_TEL, containerFactory = "queueListenerFactory")
    public void receiveTel1(MessageTel messageTel) {
         log.info("-----receive tel message-----"); 
         
    }

    /**
     * 发送邮件
     *
     * @param messageEMail
     */
    @JmsListener(destination = QueueConfig.MESSAGE_EMAIL, containerFactory = "queueListenerFactory")
    public void receiveEmail(MessageEMail messageEMail) {
        log.info("-----receive email message-----");
          
    }
}

每启动一个监听,会实例化三个消费者。

转载于:https://my.oschina.net/gaomq/blog/1837442

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值