• 解决spring boot在RabbitMQ堆积消息情况下无法启动问题


    最近遇到一个问题,服务站点上线之前,先去新建需要的rabbitmq并绑定关系,此时 如果发送消息方运行,

    那边会造成新建的q消息部分堆积得不到及时消费

    那么问题来了?

    在消息堆积情况下,服务站点无法启动,导致一直卡在那里的情况。

    而消费端干了什么呢?

    1.调用第三方服务查询数据

    2.查询数据库数据并更新操作

    经过调试我们分析下,在调用第三方服务的时候,卡在那里 了

    那么什么原因导致呢?

    spring在启动的时候,会监听q 执行消费,而消费里面的逻辑代码中的相关组件还没初始化导致。

    怎么解决这个问题呢?

    第一个方案:

    1.解除绑定关系,清理消息,重新启动站点,绑定消息关系

    2.修改代码

    之前代码是这样的

    public abstract class BaseMqJob implements Handler{

    protected String namespace;
    protected String queueName;
    protected int consumerNum;

    @Autowired
    protected MQService mqService;

    /**
    * 初始化MQ参数
    */
    public abstract void initParams();

    @PostConstruct
    public void startListener(){

    initParams();

    System.out.println("队列"+queueName+"监听开始...");

    listener(namespace,queueName,consumerNum,this);
    }

    private void listener(String namespace,String queue,int consumerNum,Handler handler){
    mqService.listener(namespace,queue,consumerNum,handler);
    }


    }

    使用了@PostConstruct,此时需要把这个注解去掉,这个和这个注解执行的顺序有关@PostConstruct

    然后新增一个类:


    /**
    * Created by lichuanjie on 2018/10/18.
    */
    @Component
    @Slf4j
    public class ManageListener {
    @Autowired
    private OrderDeliveryFreeGiftMQListener giftMQListener;
    @Autowired
    private ProductChangeMQListener productChangeMQListener;

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event){
    giftMQListener.startListener();
    productChangeMQListener.startListener();
    }
    }

    这种方式就会在其他容器启动之后去监听q消息

  • 相关阅读:
    englis translate,word
    三层架构 业务应用划分
    01 sharepoint 2010开发概述
    项目管理框架,生命周期与组织,管理过程,项目管理知识领,项目经理应具备的技能和素质
    New Text Document.udl
    03 sharepoint 2010 UI 改进
    WCF
    Sharepoint2010学习内容列表介绍
    测试概论,基础,ST评估与质量,ST过程与管理,应用负载压力测试
    ios NSDictionary 操作
  • 原文地址:https://www.cnblogs.com/flyrock/p/9811542.html
Copyright © 2020-2023  润新知