gpt4 book ai didi

java - 确保 Spring 上下文在 ThreadPoolTask​​Executor 测试期间保持 Activity 状态的智能方法

转载 作者:行者123 更新时间:2023-12-02 09:08:42 26 4
gpt4 key购买 nike

我们正在尝试在应用程序的多线程部分和数据库访问之间实现某种保证,以便数据库不会受到太多线程的影响(客户要求),同时保留应用程序的其他部分系统充分利用必要数量的线程。

设计似乎可以工作(Spring Batch Partitioning + 使用 ThreadPoolTask​​Executor 处理数据访问),但问题在于测试设计(基于 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"));
}
});
}

}

最佳答案

现在您的测试似乎是同步的,因为您在 dispatch(...) 方法内调用了 completionService .take() 两次。 take() 将等待作业完成。因此,当我读到它时,您根本不需要线程 sleep 。

此外,我根本不认为需要 CompletionService。您应该只保留 2 个 future,然后一次对它们调用 get(...) 。看起来您正在等待两个调用完成,并且它们将同时运行。 CompletionService 仅当您可以立即开始处理其中一个结果时才有效。

关于java - 确保 Spring 上下文在 ThreadPoolTask​​Executor 测试期间保持 Activity 状态的智能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12174993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com