Выполнение зависимых задач в Java - PullRequest
1 голос
/ 03 декабря 2010

Мне нужно найти способ выполнения взаимозависимых задач.

  • Первая задача - это загрузить zip-файл с удаленного сервера.
  • Задача второй задачи - разархивировать файл, загруженный первой задачей.
  • Третья задача должна обработать файлы, извлеченные из zip.

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

Любые предложения, шаблоны или API Java?

С уважением!

Ответы [ 6 ]

0 голосов
/ 03 декабря 2010

Я думаю, что вас интересует какое-то определение транзакции.
* Т.е. 1002 * - Определить TaskA (например, загрузить)
- Определить TaskB (например, распаковать)
- Определить TaskC (например, процесс)
Предполагая, что вы намерены иметь задачи, работающие также независимо, например, только загрузить файл (не выполнять также TaskB, TaskC), вы должны определить Transaction1, состоящий из TaskA,TaskB,TaskC или Transaction2, состоящий только из TaskA.
Семантика, например что касается Transaction1 , что TaskA, TaskB и TaskC должны выполняться последовательно, и все или ни один из них не может быть зафиксирован в определениях ваших транзакций.
Определения могут быть в файлах конфигурации xml, и вы можете использовать платформу, например Кварц для составления расписания.
Более высокая конструкция должна проверять транзакции и выполнять их, как определено.

0 голосов
/ 03 декабря 2010

Обычный способ выполнить эти задачи - это;вызывайте каждую задачу по порядку и генерируйте исключение в случае сбоя, препятствующего выполнению следующих задач.Что-то вроде

try {
  download();
  unzip();
  process();
} catch(Exception failed) {
  failed.printStackTrace();
}
0 голосов
/ 03 декабря 2010

Для ежедневного выполнения вы можете использовать Quartz Framework .

Поскольку задачи зависят друг от друга, я бы порекомендовал оценить коды ошибок или исключения, которые возвращаются задачами.Затем продолжите, если предыдущее задание было выполнено успешно.

0 голосов
/ 03 декабря 2010

Создайте один открытый метод для выполнения полной цепочки и частных методов для задач:

public void doIt() {
  if (download() == false) {
     // download failed
  } else if (unzip() == false) {
     // unzip failed;
  } else (process() == false)
     // processing failed
  }
}

private boolean download() {/* ... */}
private boolean unzip() {/* ... */}
private boolean process() {/* ... */}

Таким образом, у вас есть API, который гарантирует, что все шаги выполняются в правильной последовательности и что шаг является тольковыполняется, если выполняются определенные условия (приведенный выше пример иллюстрирует этот шаблон)

0 голосов
/ 03 декабря 2010

Это немного зависит от внешних требований. Есть ли участие пользователя? Мониторинг? Alerting? ...

Очевидно, что самыми простыми были бы просто методы, которые проверяют, сделал ли предыдущий то, что должен.

  1. download() загрузка файла в указанное место.
  2. unzip() извлекает файл в указанное место, если загруженный файл находится на месте.
  3. process() обрабатывает данные, если они были извлечены.

Более "формальный" способ сделать это - использовать механизм рабочего процесса. В зависимости от требований, вы можете получить некоторые, которые делают все, от причудливых UI, до тех, которые следуют формальным стандартизированным .XML-определениям рабочего процесса - и любые другие.

http://java -source.net / с открытым исходным кодом / Workflow-системы

0 голосов
/ 03 декабря 2010

Кажется, что вы не хотите делить их на задачи, просто сделайте так:

process(unzip(download(uri)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...