우리는 응용 프로그램의 멀티 스레드 부분과 데이터베이스 액세스 사이에 일종의 보증을 구현하여 DB가 너무 많은 스레드 (사용자 요구 사항) 동시에 시스템의 다른 부분을 필요한만큼의 스레드와 함께 사용합니다.ThreadPoolTaskExecutor 테스트 중에 스프링 컨텍스트가 살아 있는지 확인하는 좋은 방법
디자인은 (스프링 배치 파티셔닝 + ThreadPoolTaskExecutor를 사용한 데이터 액세스 처리) 작동하지만 디자인을 테스트하는 데 문제가있는 것 같습니다 (http://helenaedelson.com/?p=432 기준).
지금은 Threadsleep (4000)을 내 단위 테스트에 추가하여 생성 된 추가 스레드가 작업을 끝내기 전에 Spring 컨텍스트가 테스트에서 강제 종료되지 않도록해야합니다. 리턴 값을 메인 쓰레드에 돌려 준다.
누구든지이 테스트를보다 스마트하게 구현하는 방법에 대해 더 좋은 아이디어가 있습니까?
테스터 :
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:partitionJdbcJob.xml" })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TaskTests {
protected static final Logger logger = LoggerFactory.getLogger(TaskTests.class);
@Autowired
private OrderServiceImpl orderService;
@Test
public void testExecution() {
logger.info("Starting execution thread...");
for (int i = 0; i < 8; i++) {
orderService.dispatch();
}
try {
// So that spring context is not destroyed from under the multi-threaded runnables
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
시험 서비스 :
@Service("orderServiceImpl")
public class OrderServiceImpl {
protected static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
@Resource(name = "beanTaskExecutor")
private TaskExecutor taskExecutor;
// private AsyncTaskExecutor taskExecutor;
CompletionService completionService;
@Autowired
public void OrderServiceImpl(DataSource dataSource) {
completionService = new ExecutorCompletionService(taskExecutor);
}
public void dispatch(final RetailPriceOptimization order) {
logger.info("Starting dispatch execution...");
if (this.taskExecutor != null) {
logger.info("taskExecutor found...");
this.taskExecutor.execute(new Runnable() {
public void run() {
withExecutor(order);
}
});
}
try {
Object future1 = completionService.take().get();
Object future2 = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
logger.info("Completed dispatch execution...");
}
private void withExecutor(final RetailPriceOptimization order) {
logger.info("Starting withExecutor execution...");
Object result1 = completionService.submit(new Callable<String>() {
public String call() {
return findById("0000dd2gsl1u1546");
}
});
Object result2 = completionService.submit(new Callable() {
public Object call() {
return orderDao.find(new Long("16"));
}
});
}
}
이