Java Framework для управления задачами
мой вопрос в том, существует ли в Java среда для управления и одновременного запуска задач с логическими зависимостями.
Моя задача такова:
У меня есть много независимых задач (Let say A, B, C, D...), Они реализованы как Команды (как в Command pattern). Я хотел бы иметь своего исполнителя, который будет принимать все эти задачи и выполнять их параллельно.
Задачи могут быть зависимыми друг от друга (например, я не могу запустить C, до запуска A), синхронно или асинхронно.
Я также хотел бы включить пользовательскую эвристику, чтобы повлиять на выполнение планировщика, например, если задачи A и B являются интенсивными с точки зрения ЦП, а C, скажем, имеет высокое потребление памяти, имеет смысл запускать A и C параллельно, а не для запуска A и B.
Прежде чем погрузиться в создание этого материала самостоятельно (я думаю о java.util.concurrent + ограничениях/правилах, основанных на аннотациях), мне было интересно, может ли кто-нибудь указать мне на какой-то проект, который мог бы удовлетворить мои потребности.
Большое спасибо заранее
Ответы
Ответ 1
Я не думаю, что существует инфраструктура для управления задачами, которые могут выполнять ваши требования. Вы находитесь на правильном пути, используя шаблон Command. Вы можете взглянуть на структуру Akka для упрощенной модели concurrency. Акка основана на модели Actor:
Модель актера - еще одна очень простая модель высокого уровня concurrency: актеры не может ответить на несколько сообщений (сообщения помещаются в очередь почтовых ящиков) и может отправка сообщений, а не обмен переменные. Пока сообщения неизменяемых структур данных ( всегда верен в Эрланге, но должен быть конвенция на языках без средств обеспечения этого имущества), все поточно-безопасный, без каких-либо другой механизм. Это очень похоже запросить цикл, найденный в Интернете разработки MVC. http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/
Akka написан в Scala, но он предоставляет чистый API Java.
Ответ 2
Я бы рекомендовал вам изучить возможность использования ant
для этой цели. Хотя ant
известен как популярный инструмент сборки, на самом деле это движок, управляемый XML, который выполняет различные задачи. Я думаю, что его флаг fork=true
выполняет именно то, что вам нужно: запускает задачи одновременно. Поскольку любое java-приложение ant
может быть выполнено из другого java-приложения: просто вызовите его метод main
. В этом случае вы можете обернуть свои задачи с помощью API ant, т.е. Реализовать их как задачи ant.
Я никогда не пробовал такой подход, но я считаю, что он должен работать. Я подумал об этом несколько лет назад и предложил его руководству в качестве возможного решения проблемы, аналогичной вашей.
Ответ 3
Модуль планирования заданий Eclipse способен обрабатывать взаимозависимые задачи. Взгляните на http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html.
Ответ 4
Для этой цели существует структура, называемая dexecutor (Отказ от ответственности: я являюсь владельцем)
Dexecutor - очень легкая платформа для надежного выполнения зависимых/независимых задач, для этого она предоставляет минимальный API.
- API для добавления узлов в граф (addDependency, addIndependent, addAsDependentOnAllLeafNodes, addAsDependencyToAllInitialNodes. Позже две являются гибридной версией первых двух)
- а другой - для выполнения узлов в порядке.
Вот простейший пример:
DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor();
executor.addDependency(1, 2);
executor.addDependency(1, 2);
executor.addDependency(1, 3);
executor.addDependency(3, 4);
executor.addDependency(3, 5);
executor.addDependency(3, 6);
//executor.addDependency(10, 2); // cycle
executor.addDependency(2, 7);
executor.addDependency(2, 9);
executor.addDependency(2, 8);
executor.addDependency(9, 10);
executor.addDependency(12, 13);
executor.addDependency(13, 4);
executor.addDependency(13, 14);
executor.addIndependent(11);
executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING);
Вот как будет построен граф зависимостей
![введите описание изображения здесь]()
Задачи 1,12,11 будут выполняться параллельно, один раз из этих задач завершает выполнение зависимых задач, например, позволяет сказать, что задача 1 завершается, задачи 2 и 3 выполняются аналогично после задания 12, заканчивается выполнение задачи 13 и т.д.