Как поток успешно завершится в функции Spring Asyn c и как рекурсивно вызвать ту же функцию в многопоточном методе в java - PullRequest
0 голосов
/ 19 марта 2020

Я вызываю функцию @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);
}
...