ConcurrentUpdateSolrClientでautoCommitが効かない場合の対処方法

Solrに対する頻繁なCommitは、Commitやインデクシング処理の速度悪化の要因となります。

回避方法としてはautoCommitの利用が挙げられますが、

SolrJのConcurrentUpdateSolrClientをtry-with-resources文で利用している場合に、なぜかインデクシングされない問題がありました。

今回は、その問題を回避するためにやったことを紹介します。

autoCommitの効かなかったコード

solrconfig.xmlにautoCommitが設定されていたため、autoCommitされる事を期待して、明示的なcommitをリクエストしなかったところ、Solrにインデクシングされなかった。

   public void batchIndex(String url, Collection<SolrInputDocument> docs) throws IOException, SolrServerException {
        try (SolrClient client = new ConcurrentUpdateSolrClient.Builder(url).build()) {
            client.add(docs);
            // client.commit(true, true); 明示的なcommitをリクエストしない
        }
    }

やったこと

調査

  • Solrサーバへリクエストが飛んでいるかどうかを確認。
    • なぜかリクエストが飛んでいなかった。
  • ConcurrentUpdateSolrClientの実装を確認。
    • リクエストを行う処理は複数スレッドで並列で行う処理となっているが、close()メソッドがコールされると、処理を中断するようになっていた。

対応後のコード

ConcurrentUpdateSolrClient#blockUntilFinished()をコールし、処理完了まで待機するようにした。

   public void fixedBatchIndex(String url, Collection<SolrInputDocument> docs) throws IOException, SolrServerException {
        try (ConcurrentUpdateSolrClient client = new ConcurrentUpdateSolrClient.Builder(url).build()) {
            client.add(docs);
            // 処理完了まで待機する
            client.blockUntilFinished();
        }
    }