2

cassandra-unit を使用するストア ユニット テストを作成しています。

public class StoreTest {

  public void before() throws Exception {
    EmbeddedCassandraServerHelper.startEmbeddedCassandra();
    DataLoader dataLoader = new DataLoader("mydata", "127.0.0.1:9171");
    dataLoader.load(new ClassPathJsonDataSet("cassandra.json"));
  }

  @After
  public void after() throws Exception {
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
  }

  @Test
  public void testSomething() {
    // test code
  }
}

テストは正常に実行され、メモリ内の Cassandra インスタンスに接続でき、適切な結果が返されます。ただし、cassandra をシャットダウンすると、ログに次の例外が記録されます。

17:05:48.666 [StorageServiceShutdownHook] INFO  o.a.cassandra.thrift.ThriftServer - Stop listening to thrift clients
17:05:48.667 [StorageServiceShutdownHook] INFO  org.apache.cassandra.gms.Gossiper - Announcing shutdown
17:05:48.782 [GossipTasks:1] DEBUG o.a.c.c.DebuggableThreadPoolExecutor - Task cancelled
java.util.concurrent.CancellationException: null
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:250) ~[na:1.7.0_21]
    at java.util.concurrent.FutureTask.get(FutureTask.java:111) ~[na:1.7.0_21]
    at org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor.extractThrowable(DebuggableThreadPoolExecutor.java:230) [cassandra-all-1.2.0.jar:1.2.0]
    at org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor.logExceptionsAfterExecute(DebuggableThreadPoolExecutor.java:194) [cassandra-all-1.2.0.jar:1.2.0]
    at org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor.afterExecute(DebuggableScheduledThreadPoolExecutor.java:46) [cassandra-all-1.2.0.jar:1.2.0]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153) [na:1.7.0_21]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_21]
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21]
17:05:49.667 [StorageServiceShutdownHook] INFO  o.a.cassandra.net.MessagingService - Waiting for messaging service to quiesce
17:05:49.668 [ACCEPT-/27.0.0.1] INFO  o.a.cassandra.net.MessagingService - MessagingService shutting down server thread.

これはどこから来て、どうすればそれを防ぐことができますか?

4

2 に答える 2

0

問題はメソッド DebuggableThreadPoolExecutor.extractThrowable にあります。ソースコードは次のとおりです。

 public static Throwable extractThrowable(Runnable runnable)
{
    // Check for exceptions wrapped by FutureTask.  We do this by calling get(), which will
    // cause it to throw any saved exception.
    //
    // Complicating things, calling get() on a ScheduledFutureTask will block until the task
    // is cancelled.  Hence, the extra isDone check beforehand.
    if ((runnable instanceof Future<?>) && ((Future<?>) runnable).isDone())
    {
        try
        {
            ((Future<?>) runnable).get();
        }
        catch (InterruptedException e)
        {
            throw new AssertionError(e);
        }
        catch (CancellationException e)
        {
            logger.debug("Task cancelled", e);
        }
        catch (ExecutionException e)
        {
            return e.getCause();
        }
    }

    return null;
}

ご覧のとおり、デバッグ警告でタスクのキャンセルがログに記録されます。私がしたことは、行logger.debug("Task cancelled", e);をに変更することでしたlogger.debug("Task cancelled (see DebuggableThreadPoolExecutor.extractThrowable)");。このようにイベントはログに記録されますが、注意を引くスタック トレースでログが汚染されることはありません。

于 2015-04-30T07:53:33.550 に答える
0

停止方法に問題があったようです。私の推測では、まだシャットダウン中のシステムの一部のワーカー スレッドが、終了する前に中断されているようです。最新のEmbeddedCassandraServerHelperコードは、stopEmbeddedCassandra メソッドが完全には機能しないというコメントで非推奨になっています。

独自のコードを使用して単体テストに cassandra を組み込みます。EmbeddedCassandraServerHelper クラスのように activate() メソッドは使用しませんが、代わりに CassandraDaemon の init() および start() メソッドを使用します。その後、stop() メソッドが機能するようです。

迷惑なログ メッセージ以外に問題がない場合は、そのクラスを抑制するようにログを構成します。それ以外の場合は、EmbeddedCassandraServerHelper の active() メソッド呼び出しを init()/start() メソッドに置き換えてみてください。

于 2013-06-10T21:50:25.937 に答える