Поиск общей асинхронной среды выполнения заданий Java / библиотека

StackOverflow https://stackoverflow.com/questions/612656

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

    Это было полезно?

    Решение

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

    Другие советы

    Возможно, вы захотите взглянуть на кварц .

      

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

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

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

      

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

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

    Чтобы продолжить с точки зрения Алекса, решение 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 - хотя вы можете, если хотите:)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top