Я пытаюсь выполнить HTTP-запросы на целевом объекте параллельно, используя Apache HTTP Client и асинхронную функцию Spring.
Вот конфигурация Async:
@Configuration
@EnableAsync
public class BackOfficeConfig {
@Bean(name = "junctionNodeTaskExecutor")
public Executor junctionNodeTaskExecutor() {
int nThreads = Runtime.getRuntime().availableProcessors() * 100;
return new ConcurrentTaskExecutor(Executors.newFixedThreadPool(nThreads));
}
}
Сейчас в службе,У меня есть следующие методы:
@Async("junctionNodeTaskExecutor") // Async methods have to be public
public void checkJunctionNode(JunctionNode junctionNode) {
JunctionNodeChecker junctionNodeChecker = new JunctionNodeChecker(junctionNode);
Instant now = Instant.now();
// Details dealing with sending the HTTP request
}
private void collectJunctionNodes() {
logger.info("Inside add Junction Node");
List<JunctionNode> junctionNodeList = new ArrayList<>();
int count = 0;
while (count < 100) {
JunctionNode junctionNode = (JunctionNode) rabbitMQService.getFromQueue(RabbitMQConfig.QUEUE_CHECK_JUNCTION_NODE);
if (junctionNode == null)
break;
junctionNodeList.add(junctionNode);
count++;
}
logger.info("Collected JunctionNode count: {} for checking", count);
junctionNodeList.forEach(this::checkJunctionNode);
}
Метод collectionJunctionNodes, собирать объекты узлов из очереди rabbitMQ 100 одновременно.В журналах я вижу следующее сообщение:
Собранный счетчик JunctionNode: 100 для проверки
Это, как и ожидалось.Теперь у меня есть 100 узлов, но когда я отправляю эти 100 для параллельного выполнения с помощью оператора потока forEach в строке ниже, я вижу в журналах checkJunctionNode , что каждый узел проверяется через 5-6 секунд,Нет параллельного выполнения.
Что не так?