Задание:
Есть данные которые превышают объем оперативной памяти. Необходимо отсортировать.
На вход поступают пары (DateTime, Callable). Нужно реализовать систему, которая будет выполнять Callable для каждого пришедшего события в указанный DateTime, либо как можно скорее в случае если система перегружена и не успевает все выполнять (имеет беклог). Задачи должны выполняться в порядке согласно значению DateTime либо в порядке прихода события для равныхDateTime. События могут приходить в произвольном порядке и добавление новых пар (DateTime, Callable) может вызываться из разных потоков. Решения можно оформить в любом удобном виде: проект на гитхабе, архив с исходным кодом и т.п. Можно использовать любые встроенные средства Java7/Java8.
Комментарий.
Для реализации данной задачи больше подходит использование JMS (не входит в Java SE ), тем не мение упрощенная SE версия реализована (комментарий ниже). Сама очередь будет представлена как JMS очередь. JMS провайдер должен уметь сохранять сообщения и перепосылать их. JMS сообщение содержит два поля: DateTime времени желаемого выполнения и бинарный массив (byte[]) с сериализованным Callable Реализация требований:
- Обработка большого количества сообщений: Для хранения больших данных будет использовано хранилище JMS сообщений (персистентные сообщения).
- Выполнение в указанный DateTime или до до того: тут множество вариантов. Можно использовать приоритет сообщений, можно не забирать сообшения, по которым не настал срок выполнения (делается через XA)
- Если производительности одной машины не достаточно, то можно сделать кластерную очередь и распределить нагрузку на несколько машин.
- Задания, которые не удалось выполнить будут перенаправлены в DLQ для ручного разбора
В SE варианте реализован воркер, корорый берет задачи из очереди и выполняет их. не выполненые задания направляются в другую очередь.