【问题标题】:Call to MongoRepository in an ExecutorService fails to complete在 ExecutorService 中调用 MongoRepository 无法完成
【发布时间】:2018-05-19 03:35:35
【问题描述】:

我正在运行一个 Spring Boot 应用程序并且有多个线程调用 MongoRepository。然而,这会导致奇怪的超时行为。

这是我的 MongoRepository:

public interface EquipmentRepository extends MongoRepository<Equipment, String> {

    Optional<Equipment> findByEquipmentSerialNumber(String equipmentSerialNumber);

}

这是我突出问题的代码的简化版本

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
taskExecutor.execute(() -> {
    LOG.info("Executing query...");
    Optional<Equipment> equipment = equipmentRepository.findByEquipmentSerialNumber("21133"); // guaranteed to be found
    LOG.info("Query done: {}", equipment.get().getEquipmentSerialNumber());
});
taskExecutor.shutdown();
LOG.info("taskExecutor shut down");
try {
    taskExecutor.awaitTermination(30, TimeUnit.SECONDS);
    LOG.info("taskExecutor done");
} catch (InterruptedException e) {
    System.out.println("Error");
}

生成的输出如下所示

taskExecutor shut down
Executing query...
<30 second pause>
taskExecutor done
Query done: 21133

如果我增加 awaitTermination() 的超时时间,暂停会相应增加。所以不知何故,我在 execute() lambda 中的代码被“暂停”了,只有在达到超时后才会继续。

如果我删除对设备存储库的调用,一切都会按预期工作,并且没有 30 秒的暂停。

是什么让我的代码在未达到超时的情况下无法完成?

【问题讨论】:

    标签: java spring mongodb spring-boot threadpool


    【解决方案1】:

    看起来 mongo 存储库等待“主”线程执行查询(虽然很奇怪)

    不回答您的具体问题,但可能解决您的问题:Spring Data can do async requests doc

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2021-08-14
      • 2018-09-22
      • 1970-01-01
      • 2011-08-03
      • 2021-07-15
      • 2015-07-19
      • 2016-12-26
      相关资源
      最近更新 更多