【问题标题】:How to close ElasticSearch RestHighLevelClient in spring-data in order to avoid sonar blocking issue Resources should be closed如何在 spring-data 中关闭 ElasticSearch RestHighLevelClient 以避免声纳阻塞问题 应关闭资源
【发布时间】:2021-05-07 13:43:39
【问题描述】:

Sonar 抱怨,因为 RestHighLevelClient 没有明确关闭,但我使用的是 spring-data,并且存储库对我透明地使用了客户端。

我有一个配置类

@Configuration
@EnableElasticsearchRepositories(basePackages = "foo.package.repository")
public class RestClientESConfig extends AbstractElasticsearchConfiguration {

    // elastic search host
    @Value("${spring.elasticsearch.rest.uris}")
    private String elasticsearchHost;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        return RestClients.create(
                ClientConfiguration.builder()
                        .connectedTo(elasticsearchHost)
                        .build())
                .rest();
    }
}

声纳说:

资源应该关闭

拦截器 java:S2095

实现 Closeable 接口或其超接口 AutoCloseable 的连接、流、文件和其他类在使用后需要关闭。此外,必须在 finally 块中进行关闭调用,否则异常可能会阻止调用。最好,当类实现 AutoCloseable 时,应使用“try-with-resources”模式创建资源,并自动关闭。***

我可以做些什么来避免这个声纳阻塞问题?

【问题讨论】:

    标签: elasticsearch sonarqube spring-data


    【解决方案1】:

    看起来这不是弹簧数据问题,而是声纳规则一。 Sonar 不应该检查客户端是否手动关闭,因为 Spring Data 会自动执行。

    【讨论】:

      【解决方案2】:

      我不是 Spring 数据用户,但你不能让 RestClientESConfig 实现 Closeable,这样你就可以实现 close() 方法,然后调用客户端 close() 方法吗?

      类似这种未经测试的代码?

      @Configuration
      @EnableElasticsearchRepositories(basePackages = "foo.package.repository")
      public class RestClientESConfig extends AbstractElasticsearchConfiguration implements Closeable {
      
          // elastic search host
          @Value("${spring.elasticsearch.rest.uris}")
          private String elasticsearchHost;
          private final RestHighLevelClient client;
      
          public RestClientESConfig() {
            client = RestClients.create(
                      ClientConfiguration.builder()
                              .connectedTo(elasticsearchHost)
                              .build())
                      .rest();
          }
      
          @Override
          public RestHighLevelClient elasticsearchClient() {
              return client;
          }
      
          @Override
          public void close() {
              client.close();
          }
      }
      

      【讨论】:

      • 我尝试了实现 Closeable 的方法,以查看存储库是否自动调用 close 方法,但声纳一直失败,并且没有可以调用 client.close() 的类,因为 spring-data 与存储库一起使用,所以我不要显式使用客户端。我做了类似 repository.save(item) 和 spring-data 在内部使用客户端。
      • 经过一些研究,我发现 create 方法创建了一个 ElasticsearchRestClient 一个扩展 Closeable 并覆盖 close() 的接口。所以这不是问题
      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多