返回

线上问题:发现一个 ShardSphere 启动时报 NPE 的问题

后端

我们经常会遇到各种各样的线上问题,而这些问题往往令人头疼。今天,我们又遇到了一个这样的问题——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 异常的发生。
  • 定期对系统进行监控,及时发现并解决潜在的问题。

希望这次分享对大家有所帮助。