Согласно JavaDoc :
Исключение, выдаваемое при попытке получить результат задачи, которая была прервана с помощью исключения.
Проблема, похоже, в том, что для некоторых Customer
звонок
restTemplate.postForObject("http://localhost:3000/save", c, String.class);
приводит к ошибке сервера с кодом ответа HTTP "500"
Я заметил только после прочтения вашего комментария:
У вас есть только один MyCallable
, общий для всех Customer
с.
Это не сработает, потому что ваш MyCallable
является объектом с состоянием (он хранит Customer
с void sendCustomerToInterface(Customer cust)
и должен получить этот конкретный Customer
позже в методе call()
).
Чтобы это работало, вы можете переписать MyCallable
так:
public class MyCallable implements Callable<String>{
private RestTemplate restTemplate;
private Customer c;
public MyCallable(RestTemplate rt, Customer cust) {
this.restTemplate = rt;
this.c = cust;
}
@Override
public String call() throws Exception {
System.out.println("Customer no"+ c.getId() +"On thread Number"+Thread.currentThread().getId());
return restTemplate.postForObject("http://localhost:3000/save", c, String.class);
}
}
и в контроллере вы бы написали
for(Customer c:customers) {
MyCallable myCallable = new MyCallable(restTemplate, c);
//System.out.println(c);
Future<String> future= executor.submit(myCallable);
myFutureList.add(future);
}
Кстати, ваш код неэффективен. Вы можете пропустить создание списка customers
и просто написать
for (Customer c: repo.findAll()) {
//...
}