Я вызываю функцию @Async
с моего контроллера и похоже, что поток не прерывается после завершения метода makeCallWithRestTemplate
из HttpServiceClient
класса.
- Вопрос 1- Как мне убедиться, что поток будет закрыт после выполнения своей задачи?
- У меня есть два типа задач - независимая задача и зависимая задача. Теперь мое требование - я получу список задач в качестве входных данных, и мне нужно будет сначала выполнить все независимые задачи, а затем выполнить зависимые задачи на основе некоторого условия, как показано ниже
Вопрос 2- как только все независимые задачи будут выполнены, подождите здесь, теперь мой вопрос, как ждать здесь?
Вопрос 3- как только дождитесь завершения снова, вызовите метод restTemplate.exchange с зависимой задачей, как я могу сделать его рекурсивным, будет ли мой хэш-файл безопасным для потоков в рекурсивном?
- Вопрос 4- В методе
makeCallWithRestTemplate
я использую hashmap, который получает дальнейший переход к извлеченному приватному методу, теперь мой следующий вопрос: безопасна ли hashmap здесь в многопоточном режиме среда, потому что для меня это локальная переменная, которая будет отличаться для разных потоков? или мне нужно использовать ConcurrentHashmap здесь? Как это проверить?
Структура запроса
[
{ independent task 1
},
{ dependent task 1,
"dependency": { // dependency is that, execute task 1 first
and then based on its result code execute dependent task 1
"===": [
"$[0].response.http_body.action.result_code",
"SUCCESS"
]
}
}
]
контроллер
@RestController
@RequestMapping("/abc")
public class ActionController {
@Autowired
private HttpServiceClient client;
@PostMapping
public ResponseEntity<JsonNode> performMultipleActions(@RequestBody List<List<ABC>> abc) {
return client.callExternalService(abc);
}
}
@Component
public class HttpServiceClient {
@Autowired
private RestTemplate restTemplate;
@Async
public CompletableFuture<Map<Integer, ResponseEntity<JsonNode>>> makeCallWithRestTemplate(
List<ABC> requests) throws IOException {
int index = -1;
Map map = new hashmap();
while (iterator.hasNext()) {
index++;
Abc abc = iterator.next();
if (dependency == null) {
extracted(mapOfResult, index, action);
}else{
//create a map of with index as a key and object as a value
map.put(index, request);
}
// **Question 3-** once all the independent task will get executed wait here, Now my question is how to wait here ?
//**Question 4-** once wait complete again call restTemplate.exchange method with dependent task, how can i make it recursive, will my hashmap would be threadsafe in recursive?
}
return CompletableFuture.completedFuture(exchange);
}
}
private void extracted(Map<Integer, ResponseEntity<JsonNode>> mapOfResult, int index, ActionRequest action)
throws JsonProcessingException, JsonMappingException {
ResponseEntity<JsonNode> exchange = restTemplate.exchange(urlObj,
HttpMethod.resolve(action.getMethod()), entity, JsonNode.class);
mapOfResult.put(index, exchange);
}