2009-03-04 4 views
5

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

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

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

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

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

ответ

3

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

8

Возможно, вы захотите посмотреть Quartz.

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

2

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

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

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

2

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

2

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

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

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

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

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

Вот ссылка на Quickstart guide in the master-worker implementation on the Terracotta Forge.

Что больше - Terracotta не требует, чтобы вы реализуете Сериализуемый - хотя вы можете, если вы хотите :)

+0

URL, устарело, попробуйте этот [мастер-рабочий с терракотовой] (HTTP: // www.infoq.com/articles/master-worker-terracotta) –

Смежные вопросы