2017-12-05 22 views
0

저는 Spring Boot 응용 프로그램을 실행 중이며 MongoRepository를 호출하는 여러 스레드가 있습니다. 그러나 이로 인해 이상한 시간 초과 동작이 발생합니다. Executor 서비스를 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 

과 같은 문제를 강조한다 :

내 MongoRepository입니다 awaitTermination()의 타임 아웃은 그에 따라 증가합니다. 그래서 어떻게 든 내 execute() 람다 내 코드는 "일시 중지"이며 시간 제한에 도달 한 후에 만 ​​계속됩니다.

equipmentRepository에 대한 호출을 제거하면 모든 것이 예상대로 작동하며 30 초의 일시 중지가 없습니다.

시간 초과에 도달하지 않고 코드가 완료되지 않도록하려면 어떻게해야합니까? 봄 데이터 비동기가 doc

를 요청 할 수 있습니다 : 몽고의 저장소 문제에 대한

가 특정 질문에 대한 대답하지 쿼리 (하지만 매우 이상), 그러나 아마 솔루션을 수행 할 '주'스레드를 대기처럼

답변

0

이 보이는