【问题标题】:NullPointerException on cassandra ThriftServer stopcassandra ThriftServer 停止上的 NullPointerException
【发布时间】:2017-01-17 02:18:03
【问题描述】:

我正在使用 cassandra 在我的应用程序中存储数据。一切都很好,直到我试图阻止它。停止时,有时我会收到如下 NullPointerException 异常:

15:58:56.869 ERROR [Thread-2] [CassandraDaemon.java:185] Exception in thread Thread[Thread-2,5,main]
java.lang.NullPointerException: null
at org.apache.cassandra.thrift.ThriftServer.stop(ThriftServer.java:70) [cassandra-all-2.2.6-E001.jar:2.2.6-E001]
at org.apache.cassandra.service.CassandraDaemon.stop(CassandraDaemon.java:452) [cassandra-all-2.2.6-E001.jar:2.2.6-E001]
at org.apache.cassandra.service.CassandraDaemon.deactivate(CassandraDaemon.java:564) [cassandra-all-2.2.6-E001.jar:2.2.6-E001]
at mypackage.CassandraDaemonForTest$1.run(CassandraDaemonForTest.java:96) [testutils-6.3.0.jar:na]

根据类源,这就是问题发生的地方:

public void stop()
{
    if (server != null)
    {
        server.stopServer();
        try
        {
            server.join();
        }
        catch (InterruptedException e)
        {
            logger.error("Interrupted while waiting thrift server to stop", e);
        }
        server = null;
    }
}

显然,同一个 ThriftServer 的多个实例正在运行,当我尝试停用时,一些实例通过了 null 检查并导致在实例上调用 next 方法时出现问题。我的调试器在同一个实例上至少显示了三个对该方法的调用:

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: java nullpointerexception cassandra


    【解决方案1】:

    此问题已在 CASSANDRA-12105 中报告并修复,适用于 2.2.8、3.0.9、3.8 及更高版本。如果多个线程同时调用stop,则可以在另一个线程检查后将server 设置为null

    server != null
    

    然后在以下调用中抛出NullPointerException

    server.stopServer(); 
    // or
    server.join();
    

    method was made synchronized 用于隔离检查和调用。

    考虑升级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多