zoukankan      html  css  js  c++  java
  • 解决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消息

  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/flyrock/p/9811542.html
Copyright © 2011-2022 走看看