Как отложить запуск весенних бобов? - PullRequest
7 голосов
/ 11 августа 2010

Наличие весеннего приложения (на самом деле приложение grails), которое запускает сервер apache-activemq в качестве весеннего компонента и пару маршрутов apache-camel.Приложение использует Hibernate для работы с базой данных.Проблема проста.Activemq + Camel запускается BEFORE grails внедряет специальные методы в доменные объекты hibernate (собственно методы сохранения / обновления и т. Д.).Итак, если activemq уже имеет некоторые данные при запуске - верблюд начинает обрабатывать сообщения без добавления методов DAO.Это не с grails.lang.MissingMethodException.Необходимо отложить запуск activemq / camel до того, как Grails внедрит специальные методы в доменные объекты.

Ответы [ 4 ]

5 голосов
/ 11 августа 2010

Если все они определены как фасоль, вы можете использовать

<bean id="activeMqBean" depends-on="anotherBean" />

Это обеспечит инициализацию anotherBean до activeMqBean

4 голосов
/ 12 августа 2010

Вы можете переместить управление MQ в плагин? Это увеличит модульность, и если вы объявите в plugin-descriptor

def loadAfter = ['hibernate']

у вас должно быть желаемое поведение. Работает для JBPM плагин

3 голосов
/ 12 августа 2010

Я не уверен в вашем случае, но ленивая загрузка также может помочь, например:

<bean id="lazybean" class="com.xxx.YourBean" lazy-init="true">

Ленивый инициализированный компонент указывает контейнеру IoC на создание экземпляра компонента при его первом запросе.Это может помочь вам задержать загрузку нужных вам бобов.

0 голосов
/ 04 февраля 2015

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

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

/**
 * bootstrap latch processor
 */
 @Log4j
 class BootstrapLatchProcessor implements Processor {
     private final CountDownLatch latch = new CountDownLatch(1)

     @Override
     void process(Exchange exchange) throws Exception {

         if(latch.count > 0){
            log.info "waiting for bootstrapped @ ${exchange.fromEndpoint}"
            latch.await()
         }

         exchange.out = exchange.in
     }

     /**
      * mark the application as bootstrapped
      */
     public void setBootstrapped(){
         latch.countDown()
     }
 }

Затем используйте его как компонент в вашем приложении и вызовите метод setBootstrapped в вашем Bootstrap.groovy

Затем в вашем RouteBuilder вы помещаете процессор между конечной точкой и пунктом назначения для всех маршрутов, на которые вы ожидаете приходить сообщения до запуска приложения:

from("activemq:a.in ").processRef('bootstrapProcessor').to("bean:handlerService?method=handle")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...