Здравствуйте, Neco, Вы писали:
N>Появилась задача реализовать наколенную ESB по-быстрому, а частью ESB является реализация очередей (queues). В качестве хранилища имеется либо файловая система, либо Oracle. Файловую систему я сразу отбросил, начал с реализации на оракле в виде таблиц.
Есть ли реальная необходимость "забирать" задачи из очереди в БД напрямую из worker'ов? Почему бы не сделать отдельный поток/процесс, который выбирает в себя весь список задач (список id), которые нужно выполнить, а всем worker'ам выдавет id следующей задачи по запросу "Дай мне следующую задачу"? В случае многопроцессовой реализации это, возможно, выльется в написание некого сервиса, а в случае многопоточной реализации — в простой "Queue<Task>". Для отметки того, что задача выполнена и удаления ее из таблицы-очереди — делается обратная процедура — запрос "Пометить задачу как выполненную" к сервису или обратный Queue<TaskId> для многопроцессовой/многопоточной реализации соответственно.
Побочный эффект — некая задача может быть передана worker'у дважды, если программа упала после того, как она была выполнена в первый раз, но до того, как была удалена из очереди. Но с этим, ИМХО, бороться проще, чем с зависанием задачи если worker ее заблокировал и упал.
Имел опыт реализации подобных вещей и описанный мной вариант оказался проще, чем Oracle AQ.