Проверьте, обрабатывается ли запрос, отправленный на пользовательский 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 вопроса:
- Я хочу оптимизировать количество потоков в моем
ForkJoinPool
, поэтому мне нужно проверить, как это работает. Могу ли я в любом случае войти в систему, если запрос не будет немедленно обработан пулом? - Моя система получает много трафика. Так что если я сделаю
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 отправлений не будут выполнены. В зависимости от пула и размера очереди, в лучшем случае это займет примерно столько же времени, сколько потребовалась самая длительная обработка отгрузки.