Мне нужно обрабатывать сообщения параллельно, но сохраняйте порядок обработки сообщений с тем же идентификатором беседы.
Пример:
Пусть определите такое сообщение:
class Message {
Message(long id, long conversationId, String someData) {...}
}
Предположим, что сообщения поступают в следующем порядке:
Сообщение (1, 1, "a1" ), Сообщение (2, 2, "a2" ), Сообщение (3, 1, "b1" ), Сообщение (4, 2, "b2" ).
Мне нужно, чтобы сообщение 3 обрабатывалось после сообщения 1, поскольку сообщения 1 и 3 имеют одинаковый идентификатор беседы (аналогично, сообщение 4 должно обрабатываться после 2 по той же причине).
Меня не волнует относительный порядок между, например, 1 и 2, так как они имеют разные идентификаторы разговора.
Я хотел бы как можно больше использовать функциональность java ThreadPoolExecutor, чтобы избежать необходимости замены мертвых потоков вручную в моем коде и т.д.
Обновление: Количество возможных "идентификаторов беседы" не ограничено, и нет времени для разговора. (Я лично не вижу в этом проблемы, так как у меня может быть простое сопоставление с идентификатором conversId с номером рабочего, например, talkId% totalWorkers).
Обновление 2:. Существует одна проблема с решением с несколькими очередями, где номер очереди определяется, например. 'index = Objects.hash(talkId)% total': если для обработки некоторого сообщения требуется много времени, все сообщения с одним и тем же "индексом", но разные "talkId" будут ждать, даже если другие потоки доступны для его обработки. То есть, я считаю, что решения с одной интеллектуальной блокирующей очередью будут лучше, но это всего лишь мнение, я открыт для любого хорошего решения.
Вы видите элегантное решение этой проблемы?