Поиск общей асинхронной среды выполнения заданий Java / библиотека - PullRequest
5 голосов
/ 05 марта 2009

Я ищу универсальную среду выполнения асинхронных заданий Java, которая может обрабатывать Callable с или Runnable с. Это будет похоже на java.util.concurrent.ExecutorService (и, возможно, обтекание ExecutorService), но также будет иметь следующие функции:

  1. Возможность сохранения заданий в базе данных на случай, если приложение выйдет из строя во время обслуживания задания и сможет перезапустить незавершенные задания. (Я понимаю, что моя работа, возможно, должна реализовать Serializable, который в порядке.)

  2. Работа с UUID, чтобы клиент мог получить токены заданий и узнать о статусе задания. (Эта информация также будет храниться в базе данных).

Я сам начал работать над этим, опираясь на ExecutorService, но я бы предпочел готовое решение с открытым исходным кодом, если таковое существует.

Что-то, что могло бы работать в Spring Framework, было бы идеально.

Ответы [ 5 ]

8 голосов
/ 05 марта 2009

Вы можете посмотреть на Кварц .

Quartz - это полнофункциональная система планирования заданий с открытым исходным кодом, которую можно интегрировать или использовать практически с любым приложением J2EE или J2SE - от самого маленького автономного приложения до самой большой системы электронной коммерции. Кварц можно использовать для создания простых или сложных графиков выполнения десятков, сотен или даже десятков тысяч заданий; задания, задачи которых определены как стандартные компоненты Java или EJB. Кварцевый планировщик включает в себя множество функций корпоративного класса, таких как транзакции JTA и кластеризация.

3 голосов
/ 05 марта 2009

Вы можете использовать Кварц и создать конкретный Job адаптер, который делегируется Runnable или Callable. Кварцевый интерфейс Job добавляет возможность поддерживать некоторое состояние между вызовами задачи. При желании Quartz может надежно хранить задания и их состояние в реляционной базе данных и выполнять их на масштабируемом кластере хостов.

2 голосов
/ 06 марта 2009

Чтобы поддержать точку зрения Алекса, решение Terracotta не сохранит ваши задания в базе данных, а будет сохранено в хранилище распределенной памяти Terracotta.

Поскольку Terracotta сохраняет хранилище памяти на диске, это более эффективный вариант помещения этих заданий в базу данных.

В то же время, он дает вам чистую модель программирования POJO, так что вам даже не придется иметь дело с DB txns, ORM и тому подобным - если только ваша конкретная рабочая нагрузка не взаимодействует с БД (в этом случае Terracotta здесь не помогает и не ранит, а просто помогает распределить работу).

Шаблон MasterWorker поможет вам распределить работу по сетке, и вы можете очень легко начать использовать DistributedExecutorService, отправка работы выглядит следующим образом:

CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();

Вот ссылка на Руководство по быстрому старту в реализации мастер-рабочий в Терракотовой Кузнице .

Более того - Terracotta не требует реализации Serializable - хотя вы можете, если хотите:)

2 голосов
/ 05 марта 2009

Другим направлением может быть что-то вроде использования Terracotta , который имеет возможность кластеризовать кучу в вашей JVM и сохранять ее для доступности. Terracotta поддерживает интеграцию с Quartz , если это полезно с точки зрения планирования. Также есть модуль интеграции мастера и обмена сообщениями , который также может быть полезен. Терракота с открытым исходным кодом.

2 голосов
/ 05 марта 2009

Посмотрите на http://www.opensymphony.com/quartz/wikidocs/Features.html и посмотрите, есть ли у вас что-то для вас.

С этой страницы:

При использовании включенного JDBCJobStore все задания и триггеры, настроенные как «энергонезависимые», сохраняются в реляционной базе данных через JDBC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...