Итак, в настоящее время у меня есть реализация Executor с блокирующей очередью, и конкретная реализация похожа на то, что у меня есть список элементов для каждого запроса, и я делю их на разделы, каждый раздел затем вычисляется, и, наконец, они объединяются, чтобы получить окончательный список.
Как мне реализовать это в LMAX? Я вижу, что когда у меня есть раздел и я помещаю его в RingBuffer, каждый раздел обрабатывается как отдельный элемент, поэтому я присоединяюсь к ним на заказ. что-то типа,
ConcurrentHashMap<Long, LongAdder> map = new ConcurrentHashMap<>();
@Override
public List<SomeTask> score(final List<SomeTask> tasks) {
long id = tasks.get(0).id;
map.put(id, new LongAdder());
for (SomeTask task : tasks) {
producer.onData(task);
}
while (map.get(id).intValue() != tasks.size()) ;
map.remove(id);
return tasks;
}
Есть ли чистый способ сделать это? Я посмотрел на https://github.com/LMAX-Exchange/disruptor/tree/master/src/test/java/com/lmax/disruptor/example и KeyedBatching в частности, но они, похоже, объединяются и выполняются в одном потоке.
В настоящее время для меня каждый раздел занимает около 200 мс, и я хотел выполнять их параллельно.
Любая помощь приветствуется.