java - ExecutorService 中对 MongoRepository 的调用无法完成

标签 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 秒的暂停。

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

最佳答案

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

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

关于java - ExecutorService 中对 MongoRepository 的调用无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654221/

相关文章:

spring - 即使在 IDP 使用 SAML 成功登录后,获取身份验证对象也为空

c# - 将 Azure Key Vault key 传递给 Blazor 应用程序中的 Services.Configure

node.js - 创建使用 Number 的模式时出现 Mongoose TypeError

java - 是否可以在视频中添加文字叠加层?

java - Java native 接口(interface) (JNI) 是适配器模式的示例吗?

java - Hbase byteArray 转 Long

java - 我正在恢复一个数据库,我需要在我的 Java 应用程序中锁定它的任何 Activity

java - Spring 3中静态内容的自动刷新

javascript - 如何在新的 Meteor Collection 文档中设置服务器上的 created_on 字段?

java - 关于泛型的一些困惑