Проверьте, обрабатывается ли запрос, отправленный на пользовательский ForkJoinPool, немедленно

У меня есть список объектов Отправления, и мне нужно совершать вызовы API, чтобы получить некоторую информацию о каждой Отправке. Я пытаюсь сделать эти сетевые вызовы параллельно. Поэтому я использую Java 8 parallelStream() и отправив его на заказ ForkJoinPool как показано ниже:

@Autowired
ForkJoinPool forkJoinPool;
...
public void someMethod(){
    ...
    List<MyObj> myObjList = null;
    try {
        myObjList = forkJoinPool.submit(() -> shipmentList.parallelStream()
            .map(shipment -> getShipmentInfo(shipment))
            .collect(Collectors.toList())
            ).get();
        } catch (Exception e){
            ...
        }
}

public MyObj getShipmentInfo(Shipment shipment) {
    // Make network call and return MyObj
}

У меня есть 2 вопроса:

  1. Я хочу оптимизировать количество потоков в моем ForkJoinPool, поэтому мне нужно проверить, как это работает. Могу ли я в любом случае войти в систему, если запрос не будет немедленно обработан пулом?
  2. Моя система получает много трафика. Так что если я сделаю submit() а также get() на autowired ForkJoinPool, будет ли мой код, ожидая отгрузки из разных запросов? Я имею в виду, скажем, я получаю 2 запроса параллельно. Запрос1 имеет 3 отправления, связанные с ним, а запрос2 имеет 5 отправлений. Так будет ли код выше ждать, пока все 8 отправок будут выполнены?

Благодарю.

1 ответ

Я хочу оптимизировать количество потоков в моем ForkJoinPool, поэтому мне нужно проверить, как он работает. Могу ли я в любом случае войти в систему, если запрос не будет немедленно обработан пулом?

Вы можете предварительно проверить, не является ли очередь отправки не пустой через ForkJoinPool.hasQueuedSubmissions(), Так что если он возвращает true - запросы не принимаются и обрабатываются немедленно. Потенциально вы могли бы поймать такой момент, даже если он в порядке, так что вы могли бы дважды проверить, что размер очереди мал с ForkJoinPool.getQueuedSubmissionCount() (обратите внимание, что он имеет сложность времени O(n), где n - количество отправленных в очередь заявок, хотя).

Моя система получает много трафика. Так что, если я выполню submit() и get() для ForkJoinPool с автопроводкой, будет ли мой код ждать отправки по различным запросам? Я имею в виду, скажем, я получаю 2 запроса параллельно. Запрос1 имеет 3 отправления, связанные с ним, а запрос2 имеет 5 отправлений. Так будет ли код выше ждать, пока все 8 отправок будут выполнены?

Да, он будет ждать, пока все 8 отправлений не будут выполнены. В зависимости от пула и размера очереди, в лучшем случае это займет примерно столько же времени, сколько потребовалась самая длительная обработка отгрузки.

Другие вопросы по тегам