Java Framework для управления задачами - PullRequest
14 голосов
/ 06 февраля 2011

Мой вопрос заключается в том, существует ли в Java инфраструктура для управления и одновременного запуска задач, имеющих логические зависимости.

Моя задача заключается в следующем: у меня много независимых задач (скажем, A, B, C, D ...), они реализованы в виде команд (как в шаблоне команд).Я хотел бы иметь своего рода исполнителя, который будет принимать все эти задачи и выполнять их параллельно.Задачи могут зависеть друг от друга (например, я не могу запустить C, перед тем как запустить A), синхронные или асинхронные.

Я также хотел бы включить пользовательские эвристики, чтобы повлиять на выполнение планировщика,например, если задачи A и B требуют значительных ресурсов процессора, а C, скажем, потребляет много памяти, имеет смысл запускать A и C параллельно, а не A и B.

Перед погружением в сборкусам этот материал (я думаю о java.util.concurrent + ограничения / правила, основанные на аннотациях), мне было интересно, может ли кто-нибудь указать мне на какой-нибудь проект, который мог бы удовлетворить мои потребности.Большое спасибо заранее

Ответы [ 4 ]

7 голосов
/ 06 февраля 2011

Я не думаю, что есть структура для управления задачами, которая могла бы удовлетворить ваши требования.Вы находитесь на правильном пути, используя шаблон команды.Вы можете взглянуть на Akka framework для упрощенной модели параллелизма.Akka основана на модели Actor:

Модель Actor - это еще одна очень простая модель параллелизма высокого уровня: актеры не могут отвечать более чем на одно сообщение одновременно (сообщения помещаются в очередь в почтовые ящики)может общаться только путем отправки сообщений, а не обмена переменными.Пока сообщения являются неизменяемыми структурами данных (что всегда верно в Erlang, но должно быть соглашением в языках без средств обеспечения этого свойства), все потокобезопасно, без какого-либо другого механизма.Это очень похоже на цикл запросов, найденный в средах веб-разработки MVC.http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka написан на Scala, но предоставляет чистый Java API.

2 голосов
/ 06 февраля 2011

Я бы рекомендовал вам изучить возможность использования ant для этой цели. Хотя ant известен как популярный инструмент для сборки, на самом деле это механизм, управляемый XML, который выполняет различные задачи. Я думаю, что его флаг fork=true делает именно то, что вам нужно: запускает задачи одновременно. Как и любое java-приложение, ant может быть выполнено из другого java-приложения: просто вызовите его main метод. В этом случае вы можете обернуть свои задачи с помощью ant API, то есть реализовать их как задачи Ant.

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

0 голосов
/ 25 августа 2016

Специально для этой цели существует платформа, называемая 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);

Вот как будет построен граф зависимостей enter image description here

Задачи 1,12,11 будут выполняться параллельно, как только одна из этих задач завершится, будут запущены зависимые задачи, например, скажем, задача 1 завершается, задачи 2 и 3 будут выполняться аналогично, как только задача 12 завершит задачу 13 и т. д.

0 голосов
/ 11 февраля 2011

Модуль планирования заданий Eclipse способен обрабатывать взаимозависимые задачи.Взгляните на http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html.

...