• 作者:老汪软件技巧
  • 发表时间:2024-11-15 10:02
  • 浏览量:131

一个周五下班,就上周五,一个平常而愉快的周五,我高高兴兴的背着电脑就回家啦!!

刚到家门,接到同事的电话,线上有个服务的其中两个插件启动不起来,报mq的io异常,这两个插件正好是同事今天修改的插件。

先交代下服务架构:这个服务分为处理器(主程序)和多个插件组成,主程序启动起来会去加载这些插件包,插件包和主程序可以理解为父子关系,插件包单独打包成zip,然后上传的固定的目录,这个目录有很多插件包:比如图片处理的插件,视频处理的插件,比如文章分类的插件,比如附件处理的插件。主程序启动的时候会去加载插件,然后运行起来,每个插件独立运行,主程序可以各个调用插件包的实现去实现具体的业务。

背景交代完:这同事就是改了图片和视频插件,然后启动主程序,其他的插件都启动成功了,就这个图片插件和视频插件启动失败。

同事在给我打电话的时候已经把这两个插件上传到测试环境测试过,主程序版本和这两插件的zip包都一样,在测试环境是能够加载到并顺利启动起来的,类似这种启动日志说明测试环境好着的。

然后我看了同事的提交记录,发现他改的代码都是业务逻辑,和插件启动的代码没关系,那么说明不是代码的问题。

我又让给我发下报错日志,主要的报错信息如下:我也没看出什么问题。

我又让同事不通过页面安装插件,直接放到对应的目录下启动主程序,发现也是不行,搞得我也没办法,然后在家我也不好操作,就背着包去公司啦。

到公司已经九点多啦,哎这该死的责任心,看上述日志确定是mq的问题,补充一下,每个插件插件启动的时候会自动创建mq的队列,每个插件的有自己专属的RabitMq队列,启动的时候自动创建,如果页面卸载的时候会自动删除队列。

第一步:我先让同事把这个处理器下其他插件的队列删除一个,然后再重启,如果删除的这个插件的队列也起不起来,报相同的错,那么就是mq的问题。然后我同事就删了一个插件的队列,重启,见证奇迹的是,删除的这个插件的mq的队列创建成功了,插件也启动起来了,他改的图片和视频插件还是报相同的错起不起来!

然后然后 我在这里有点不知道为什么了,然后我看了下插件加载的顺序,同事删除的那个插件要先启动,我怀疑是队列数量到上限啦,但是也不对之前这两插件是能启动起来的,这两插件已经在正式环境正常运行的,由于这个环境是提前个客户部署的,算没有正式上线,但是下周一要演示,我同事基于用户的需求修改了插件的代码,我们跟踪了这两插件处理的数据,发现在两天之前这两插件就没处理数据了,我们怀疑两天之前这两插件就可能坏啦,然后我怀疑队列数量问题,就卸载了其他插件,只保留图片和视频的插件,那么启动起来如果能启动起来,就是队列数量的问题。然后然后启动的时候只有图片和视频插件还是报相同的错误,启动失败!

到这里我感觉今晚可能要熬到12点啦,这玩意不好解决,然后我就去把全部报错日志下载下来,一行一行看,几乎所有得报错都是mq的jar包的报错,然后一行一行追踪终于让我发现,在mq的配置类,也就是自动生成mq的地方报错啦,报错的代码行数是这么一行,rabbitAdmin.declareQueue(queue);

周五下班心情句子__周五下班说说心情短语

@Bean
public SimpleMessageListenerContainer pluginMessageListener(DirectExchange middleExchange) {
    String messageQueue = pluginId + "xxxx1"
    Queue queue = new Queue(messageQueue, true);
    rabbitAdmin.declareQueue(queue);
    rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(middleExchange).with(pluginId + "xxxx111"));
    return createListener(connectionFactory, pluginQueueListener, messageQueue);
}

这就是创建一个持久化队列,将队列声明到 RabbitMQ中报错啦。那么说明一定是RabbitMQ服务的问题,然后我就让同事把集群的RabbitMQ服务重启了下。

然后重启成功之后,还没有启动程序,RabbitMQ服务自动出现了图片和视频的队列,且里面有很多没有消费的数据。然后启动程序正常了,没消费的数据也消费了。

总结为什么一开始没想重启下RabbitMQ,因为整个系统都用的这个RabbitMQ服务,其他程序都好的,还有这个主程序在加载其他插件的时候是能创建常规mq队列的,就这两修改的插件有问题,一开始都怀疑是代码问题或者配置问题,或者插件打包的问题,没想到是RabbitMQ服务的问题。最后经过删队列,日志跟踪,留下最后一个最不可能的情况,已经找不到其他答案了,那么就这个最不可能的情况就是答案。

至于为什么出现这种情况,我还没搞清楚,先写个文章记录下。以后遇见问题先重启!!!!


上一条查看详情 +知名开源项目官宣停更,太痛了!
下一条 查看详情 +没有了
Top