我有一个场景,其中现有代码执行以下任务(单个Java文件和类):
methodCopyDataBasedOnDates(StartDate, EndDate) {
GetDataFromSomewhere(); // Gets data from a Database table
ProcessData(); //Converts to JSON array
PasteSomewhereElse(); //Copies to Amazon S3
}
现在,由于这需要很长时间才能完成单个任务,因此我想实现Java多线程作为解决方案。 我打算像这样使用executorFramework:
LinkedBlockingQueue<whatever> allDateRangesQueue; //Contains all date ranges.
ExecutorService executorService = Executors.newFixedThreadPool(20);
while(!allDateRangesQueue.empty())
{
executorService.execute(new Runnable() {
@Override
public void run()
// DatePair consists of start date and end date pair. Eg: if input date range is one year, then this DS consists of date ranges of 1 day each 364 entries in the Queue for the threads to pick up.
final HashMap<Integer, String> datePair = allDateRangesQueue.poll();
methodCopyDataBasedOnDates(date.get(0), date.get(1), threadName);
}
});
}
问题:就模块性和效率而言,我需要更好的设计。有人可以建议一个设计吗?
答案 0 :(得分:0)
您能看看春季批吗?我认为它确实可以满足您的需求。将尝试找到一个很好的例子并更新此答案
发现: https://spring.io/guides/gs/batch-processing/,https://www.mkyong.com/spring-batch/spring-batch-hello-world-example/
此方法的工作方式是完全异步处理。您定义一个读取器,一个处理器和一个写入器,将这三个绑定在一起,它们可以并行工作。当然,假设您可以读取数据块(分页),那么它可以成为功能强大的工具。
我从未尝试理解和使用的“扩展”,但是如果有时间,它可能对您真的很有用(因为对我来说似乎满足了您的需求)是“ spring xd”,但我担心我未能充分理解它。我已经使用过Spring批处理,并且似乎是实现您所要求的简单易行的方法