В моей весенней загрузочной программе я пытаюсь использовать функцию Callable Future для многопроцессорной обработки. Чтобы быть более точным, внутри loop я открыл несколько потоков и получил список карт из функции. После этого распечатываю полученный результат. К сожалению, выдает ошибку Method threw 'java.util.concurrent.ExecutionException' exception
. Внутри подробное сообщение NullPointerException
. Я пробовал несколько способов, ни один из которых не работает.
public class MyCallable implements Callable<List<Map<String, Object>>> {
@Autowired
@Qualifier("jdbcMaster")
JdbcTemplate jdbcTemplate;
private String SQL_QUERY;
public MyCallable(){
}
public MyCallable(String SQL_QUERY){
this.SQL_QUERY = SQL_QUERY;
}
@Override
public List<Map<String, Object>> call() throws Exception {
List<Map<String, Object>> ph_list = jdbcTemplate.queryForList(SQL_QUERY);
return ph_list;
}
}
Integer listSize = regionFilials.size();
ExecutorService service = Executors.newFixedThreadPool(listSize);
List<Future<List<Map<String, Object>>>> resultList = new ArrayList<>();
for (int i=0; i<listSize; i++){
filialId = "'" + regionFilials.get(i) + "'";
SQL_RESULT = SQL_SPECIAL_INCOME.replace("?", filialId);
MyCallable myCallable = new MyCallable(SQL_RESULT);
Future<List<Map<String, Object>>> result = service.submit(myCallable);
resultList.add(result);
}
for (Future<List<Map<String, Object>>> futures : resultList){
try {
if (futures.isDone()) {
try {
System.out.println("Name: " + futures.get(20, TimeUnit.SECONDS));
} catch (TimeoutException e) {
e.printStackTrace();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.getCause();
}
}
Когда я пытаюсь получить результат оператора select SQL_RESULT обычным способом, он дает правильный результат. Проблема не в SQL. Я предполагаю, что я неправильно улавливаю будущий результат или неправильно реализую callable future.