我正在尝试使用Apache HTTP Client和Spring的异步功能在目标上并行执行HTTP请求。
这是异步配置:
@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个节点,但是当我使用下一行中的forEach流语句发送要并行执行的100个节点时,我在 checkJunctionNode 的日志中看到在5-6中正在检查每个节点秒。 没有并行执行。
出了什么问题?