• 解决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消息

  • 相关阅读:
    Android应用开发——系统自带样式Android:theme
    Android权限Uri.parse的详细资料
    Android中级教程之Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)!
    Android源码下载方法详解
    C#编程中的66个好习惯,你有多少个
    浏览时只显示指定文件类型
    如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核
    USACO2.3.1 The Longest Prefix 题解
    usaco1.1.3 Friday the Thirteenth 题解
    USACO 2.4.5 Fractions to Decimals 题解
  • 原文地址:https://www.cnblogs.com/flyrock/p/9811542.html
Copyright © 2020-2023  润新知