Облегченная «система сборки» времени выполнения

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

Раньше все отношения были неявными в структуре кода. Например:

void processClientData() {
    try {
        processA();
    } catch(Exception e) {
        log.log(Level.SEVERE, "exception occured in step A", e);
        processC(); // C doesn't depend on A, so we can still run it.
        throw e;
    }

    processB();
    processC();
    //etc... for ~20 steps
}

Я изменил это, чтобы сделать зависимости явными, унифицировать обработку ошибок и т. д., введя Задачи:

public interface Task {
    List<Task> getDependencies();
    void execute(); //only called after all dependencies have been executed
}

public class TaskRunner {
    public void run(Set<Task> targets) {
        // run the dependencies and targets ala ANT
        // make sure to run all possible tasks on the "road" to targets
        // ...
    }
}

Это начинает напоминать очень разветвленную версию системы сборки с управлением зависимостями (ANT, наиболее мне знакомый). Я не хочу использовать ANT для такого рода вещей, и, конечно же, я не хочу писать XML.

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

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

РЕДАКТИРОВАТЬ: Я ценю предложения (и буду уделять им должное внимание), но я действительно НЕ ищу «систему сборки» как таковую. То, что я ищу, - это что-то более похожее на ядро ​​ системы сборки, которое я мог бы просто вызывать напрямую из Java и использовать в качестве небольшой библиотеки с небольшим объемом служебной информации для выполнения указанного анализа зависимостей, выполнения задач, и в результате управление ресурсами. Как я уже сказал, у меня есть (работающий) код на чистой Java, и я не хочу вводить XML и весь багаж, который идет с ним, без очень веской причины.

4 голоса | спросил Joshua Warner 11 Jam1000000amWed, 11 Jan 2012 08:48:31 +040012 2012, 08:48:31

5 ответов


0

Взгляните на структуру jsr166 fork /join. Мне кажется, это именно то, что вы пытаетесь достичь.

http://docs.oracle. ком /JavaSE /7 /документы /API /Java /Util /параллельный /ForkJoinTask.html

Это включено в JDK7, но доступно как отдельный jar для 5 и 6. Если бы я не был на своем планшете, я бы написал более полный пример. Может быть, кто-то еще может расшириться за это время.

public class DependencyTreeTask extends RecursiveAction {

  private final List<DependencyTreeTask> dependencies = new ArrayList<Task>();

  public void addDependency(DependencyTreeTask t) { dependencies.add(t) }

  public void compute() {
    invokeAll(dependencies);
  }

}

...
// build tree...
DependencyTreeTask root = ...
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(root);

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

ответил fido 4 MarpmSun, 04 Mar 2012 19:58:45 +04002012-03-04T19:58:45+04:0007 2012, 19:58:45
0

По своей сути система сборки выполняет 3 вещи. Он управляет зависимостями, проверяет, «что-то создано» или нет, и «строит» то, что не построено.

Управление зависимостями - это не просто топологическая сортировка. Остальное перебирает задачи в зависимом порядке и обрабатывает их.

Вы можете легко создать что-то вроде:

BuildSystem bs = new BuildSystem();
bs.addTask(new Task1());
bs.addTask(new Task...);
bs.addTask(new TaskN());

bs.build();

public void build() {
    List<Task> sortedTasks = topologicalTaskSort(tasks);
    for(Task t : sortedTasks) {
        if (t.needsBuilding()) {
            t.execute();
        }
    }
}

Если вам не нужно выводить список задач из списка задач, то нет причин для файла XML или чего-либо еще.

Топологическая сортировка позволяет вам просто добавлять задачи в список и позволять системе разбирать вещи. Не проблема с 4 задачами, а проблема с десятками задач.

Сортировка завершается неудачно, если она обнаруживает цикл зависимости, поэтому вы получаете этот элемент управления.

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

ответил Will Hartung 11 Jpm1000000pmWed, 11 Jan 2012 19:22:43 +040012 2012, 19:22:43
0

Я хотел бы написать плагин для Maven, это не так сложно и намного легче , потому что вам нужно только предоставить соответствующую специальную логику. Вся инфраструктура предоставлена ​​Maven. Maven 3 даже даст вам такие вещи, как параллельные сборки, где ваш плагин поддерживает его бесплатно, среди всего прочего, что он предоставляет.

Одной из основных целей Maven 3 было переписывание, чтобы максимально упростить внедрение механизма рабочих процессов в ваши собственные проекты.

ответил 11 Jam1000000amWed, 11 Jan 2012 08:55:58 +040012 2012, 08:55:58
0

Я слышал, что Дженкинса использовали для такого рода вещей в дополнение к его основной роли 'системы сборки'. Я только начал использовать Дженкинс, поэтому не могу точно сказать, будет ли он делать то, что вам нужно. Я впечатлен этим до сих пор. Он относительно прост в использовании и имеет множество опций конфигурации. Для этого также существует большое количество плагинов. Просто запустите Jenkins и перейдите на страницу плагинов, чтобы просмотреть список и установить их.

ответил Sarel Botha 11 Jpm1000000pmWed, 11 Jan 2012 19:32:00 +040012 2012, 19:32:00
0

Ваш код напоминает мне о iwant , движке сборки Java, который я разрабатывал. Вы можете объявить определения цели с помощью зависимостей, используя свободный Java, и в дополнение к обычному использованию из командной строки (или скрипта Ant) вы также можете встроить свою сборку в Java-программу.

ответил Ville Oikarinen 8 Mayam17 2017, 09:08:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132