最近碰到一个很奇怪 的问题,在idea中启动springboot,正常启动,应用api接口访问都正常。打成war包后放到tomcat中不行,以前也没这个情况,就最近同步了下代码。看tomcat启动日志,也没出错呀。但是访问接口就是转圈,那说明服务是起来在的。后来想起可能问题还是没启动完成,tomcat启动完成的日志最后一部分还是没有打印出来。这种情况是假起来的,端口也有但是应用在容器中没有完成全部启动,肯定有代码有死循环,导致程序卡住无法完全加载完。
在这里可以用到jps 查询下启动的进程。
找到id 使用命令 jstack
分析下结果发现了下面这一段
找到这个kafka counsumer 发现用的是一个死循环来不断的poll数据的方式写的消费者。因为他一直抢占着cpu,在 启动后加载run 方法里 。导致了这个run方法无法结束。在tomcat容器启动就是未启动完成,导致无法正常访问服务。
public class DispatchItemController implements ApplicationRunner {
@Override public void run(ApplicationArguments args) throws Exception {
KafkaConsumer<String, String> consumer = AlarmKafkaUtil.getKafkaConsumer(host,topic,groupid); consumer.subscribe(Arrays.asList(topic)); while (true) {
。。。。。。
} } }
}
把此方法改造后,用一个线程来启动就正常往下走了。