Инструмент, который запускает java MainClasses, дизайн избегает ловушек зависимостей - PullRequest
1 голос
/ 16 февраля 2012

Мне нужно реализовать инструмент, который читает файл конфигурации и запускает приложения / программы, указанные в файле конфигурации.Этакий автоматизированный бегун для тестов.Я реализовал программу, которая делает это, однако я попал в стену зависимости.В моем текущем инструменте разработки анализирует файл конфигурации и получает карту типа программы и список заданий.Основанный на ProgramType, класс Runner выбирается и инициализируется, класс Runner является частью программы src.

//this is just a pseudo code
pkg org.Tool

class Tool {
  //after parsing
  runJobs(map) {
    if(map.get() == ProgramType)
      org.Tool.JobStats = org.ProgramType.Runner.run(Job)
  }
}

pkg org.ProgramType

class Runner {
 org.Tool.JobStats run(Job) {
   if(Job = "certain job")
     return CertainJob.run(Job)
 }
}

Для сборки инструмента мне нужен скомпилированный org.ProgramType. *;для создания ProgramType мне нужны org.Tool.Job и org.Tool.JobStats.«Ад зависимости», который я создал, очевидно, очень плохой дизайн.Я пришел с решением простого вызова jar-файла ProgramType и сохранения JobStats в файле jobStats.txt, а после завершения выполнения jar-файла прочитайте файл и обработайте его.Это решение неприемлемо, так как задания могут запускаться несколько раз со многими конфигурациями и т. Д., Просто для обработки большого количества * .txt файлов.Я думаю, что когда-то видел решение для компиляции для моей проблемы, что-то вроде инструмента «частичной компиляции», компиляции ProgramType, инструмента перекомпиляции.Однако я не могу найти его, также было бы разумно избавиться от анти-паттерна "ад зависимости".Таким образом, мой вопрос «Как я должен был спроектировать это».

(я надеюсь, что объяснение понятно, если не просто спросить)

решено

Как я писал вcomment @aviad Я искал шаблон дизайна, чтобы решить мою проблему.Я нашел один, который называется «Принцип инверсии зависимости».Здесь я даю ссылку на документ в формате PDF, описывающий шаблон, который стоит прочитать (http://www.objectmentor.com/resources/articles/dip.pdf) (Еще одно хорошее объяснение http://java.dzone.com/articles/fun-modules). Спасибо всем за вашу помощь (мне очень понравились рамки, которые вы рекомендовали).

1 Ответ

1 голос
/ 16 февраля 2012

Я думаю, что вы все еще можете использовать большую часть своего кода, если вы можете использовать SpringBatch framework.

Преимущество использования Spring batch состоит в том, что это Framework, где вся тяжелая работа былауже сделано (настройка, многопоточность, постоянство и т. д.).

По сути, Java-программы, которые вам нужно запустить, можно запустить, запустив скрипт пакетного файла \ shell, который запускается:

java -cp %JOB_CLASSPATH% %JOB_MAIN_CLASS_FULLY_QUALIFIED_CLASS_NAME%

Поэтому я бы использовал следующую схему:

Полное решение - приложение на базе Spring.Класс контроллера (ваш основной класс), который читает конфигурацию и запускает шоу.Класс контроллера заполняет очередь заданий заданиями и их конфигурациями.Затем каждое задание извлекается из очереди, а пакетное задание Spring создается программно и запускается.

Вы также можете использовать Commons Exec для выполнения пакетных файлов \ сценариев оболочки из Java.

Позже вы можете перейти к запуску в веб-контейнере (чтобы включить изменения конфигурации и запуск заданий через http) - установите флажок Spring Batch Admin

Вы также можете запуститьрешение по расписанию, если вы используете Кварц FW

Удачи!

...