返回
线上问题:发现一个 ShardSphere 启动时报 NPE 的问题
后端
2023-12-15 14:31:36
我们经常会遇到各种各样的线上问题,而这些问题往往令人头疼。今天,我们又遇到了一个这样的问题——ShardSphere 在启动时报出了一个 NPE。
背景
最近,我们正在研究 ShardingSphere。作为一个开源的分布式数据库中间件,ShardSphere 凭借其强大的功能和易用性,吸引了我们的注意。然而,在使用过程中,我们也遇到了不少问题。
问题现象
这次遇到的问题是,在启动 ShardSphere 时,系统报出了一个 NPE 异常。具体异常信息如下:
java.lang.NullPointerException
at org.apache.shardingsphere.elasticjob.lite.internal.listener.JobStatusListenerManager.execute(JobStatusListenerManager.java:78)
at org.apache.shardingsphere.elasticjob.lite.internal.listener.JobStatusListenerManager.postEvent(JobStatusListenerManager.java:64)
at org.apache.shardingsphere.elasticjob.lite.internal.listener.AbstractListenerManager.postEvent(AbstractListenerManager.java:34)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl.updateJobStatus(JobServiceImpl.java:52)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl.lambda$enableJob$3(JobServiceImpl.java:348)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl$$Lambda$1626/1095490541.accept(Unknown Source)
at com.google.common.eventbus.EventBus.post(EventBus.java:46)
at com.google.common.eventbus.EventBus.post(EventBus.java:36)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl.enableJob(JobServiceImpl.java:347)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl.addJob(JobServiceImpl.java:218)
at org.apache.shardingsphere.elasticjob.lite.internal.service.impl.JobServiceImpl.registerJob(JobServiceImpl.java:161)
at org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneByOneJobBootstrap.start(OneByOneJobBootstrap.java:44)
at org.apache.shardingsphere.elasticjob.lite.internal.bootstrap.JobBootstrap.start(JobBootstrap.java:27)
at org.apache.shardingsphere.elasticjob.lite.internal.bootstrap.EmbedBootstrap.start(EmbedBootstrap.java:58)
at org.apache.shardingsphere.elasticjob.lite.spring.boot.EmbedJobBootstrapStarter.lambda$0$EmbedJobBootstrapStarter(EmbedJobBootstrapStarter.java:72)
at org.apache.shardingsphere.elasticjob.lite.spring.boot.EmbedJobBootstrapStarter$$Lambda$261/1124564263.run(Unknown Source)
at org.springframework.boot.SpringApplicationRunListeners.run(SpringApplicationRunListeners.java:97)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1222)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1211)
at com.lvyangtao.shardingsphere.demo.job.JobBootStrap.main(JobBootStrap.java:14)
分析过程
一开始,我们对这个异常感到很困惑,因为我们并没有在代码中抛出 NPE 异常。于是,我们开始一步步分析代码,试图找出问题所在。
经过一番排查,我们终于找到了问题根源。原来,问题出在 ShardingSphere 的内部监听器机制上。在启动过程中,ShardSphere 会启动一个监听器,负责监听作业状态的变化。在这个监听器中,有一个地方没有进行空指针判断,导致了 NPE 异常的发生。
解决办法
找到问题根源后,我们对代码进行了修改,添加了必要的空指针判断。修改后的代码如下:
if (jobStatusTracker != null) {
jobStatusTracker.updateStatus(shardingContext, JobExecutionEvent.ExecutionEventStatus.JOB_RUNNING);
}
总结
通过这次线上问题,我们学到了以下几个教训:
- 遇到问题不要慌张,要冷静分析,逐步排查问题根源。
- 在代码中要养成良好的编程习惯,及时进行空指针判断,避免 NPE 异常的发生。
- 定期对系统进行监控,及时发现并解决潜在的问题。
希望这次分享对大家有所帮助。