Fork me on GitHub

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

 

posted @ 2018-10-18 16:53  会飞的笨石头  阅读(642)  评论(0编辑  收藏  举报