Я недавно работал над рефакторингом системы, которая обрабатывает пакеты клиентских данных. Система выполняет серию шагов, каждый из которых использует файлы предыдущих шагов (и иногда данные в памяти), и выдает собственный вывод в виде файлов или данных. Иногда выходные данные для определенного шага уже доступны. Я должен быть осторожным, чтобы в случае сбоя одного шага мы продолжали выполнять все возможные шаги (те, которые не зависят от неудачного шага), чтобы окончательный вывод был максимально полным. Кроме того, не все шаги должны выполняться во всех ситуациях.
Раньше все отношения были неявными в структуре кода. Например:
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 и весь багаж, который идет с ним, без очень веских причин.