Как запустить работу Quartz в среде с несколькими приложениями? - PullRequest
1 голос
/ 23 марта 2012

У меня есть веб-приложение Spring с applicationContext.xml, загруженным через ContextLoaderListener в XmlWebApplicationContext. Контекст приложения имеет планировщик Quartz (определенный с SchedulerFactoryBean, как здесь ), но не имеет ни триггера, ни задания.

Во время загрузки этого основного контекста приложения я загружаю некоторые «подключаемые» JAR-файлы, содержащие их собственный файл pluginApplicationContext.xml. Каждый pluginApplicationContext.xml загружается в GenericXmlApplicationContext как дочерний элемент основного XmlWebApplicationContext.

Эти плагины могут содержать задания Quartz (QuartzJobBean), которые запланированы в планировщике, описанном выше. Планирование должно выполняться программно через API-интерфейс Quartz, но для меня это нормально. Когда задание запускается, оно хорошо определяется Quartz и, поскольку оно расширяет QuartzJobBean, я могу получить ток с ApplicationContext до setApplicationContext. Проблема в том, что я получаю XmlWebApplicationContext вместо GenericXmlApplicationContext, из которого запланировано задание. Таким образом, я не могу вызвать getBean для получения bean-компонентов, определенных в плагине.

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

Большое спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Я не уверен, что у меня все эти весенние проблемы, но я сделал это с OSGi.

Люди часто не осознают, что вы можете встроить OSGi в существующее приложение, не внося никаких изменений в существующий код. Ричард Холл описывает это здесь http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html (API стандартизирован на 100%).

Имея фреймворк, вы можете запустить ваши плагины в фреймворке. Вы должны будете убедиться, что инфраструктура экспортирует все пакеты приложений (см. Свойство запуска org.osgi.framework.system.packages.extra). Плагины и приложения могут общаться через сервисы.

Я никогда не использовал Кварц, но у меня есть некоторый опыт планирования. Я регистрирую сервис Runnable со свойствами, подобными cron:

   @Component(properties="cron=1 * * * *")
   public void SomeImpl implements Runnable {
     public void run() {
        ...
     }
   }

Затем вам нужно будет создать пакет, который вызывает эту службу в соответствии со спецификацией cron).

0 голосов
/ 28 марта 2012

Я согласен - это хороший подход, но, может быть, вы можете просто создать один огромный контекст приложения (чтобы управлять ими всеми)? Вместо запуска вручную нового дочернего контекста приложения на основе файла pluginApplicationContext.xml просто добавьте:

<import resource="classpath:/pluginApplicationContext.xml"/>

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

...