アプリケーションのマルチスレッド部分とデータベースアクセスの間に一種の保証を実装して、DBがあまりにも多くのスレッド(顧客の要件)に見舞われないようにすると同時に、システムの他の部分を完全に利用できるようにしようとしています。必要な量のスレッドで。
デザインは(SpringBatchパーティショニング+ThreadPoolTaskExecutorを使用したデータアクセスの処理)で機能するようですが、問題はデザインのテストにあります(http://helenaedelson.com/?p=432に基づく)。
今のところ、単体テストにThread.sleep(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"));
}
});
}
}