在ExecutorService中调用MongoRepository无法完成

时间:2017-12-05 12:58:46

标签: java spring mongodb spring-boot threadpool

我正在运行一个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中的代码“暂停”并且只在达到超时后继续。

如果我删除对equipmentRepository的调用,一切都按预期工作,没有30秒的暂停。

在没有达到超时的情况下,什么使我的代码无法完成?

1 个答案:

答案 0 :(得分:0)

看起来mongo存储库等待&#39; main&#39;线程执行查询(虽然非常奇怪)

没有回答您的具体问题,但可能解决您的问题:Spring Data可以执行异步请求doc