2010-08-11 5 views
7

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

ответ

4

вы можете переместить MQ Managment в плагин? Это увеличило бы модульность, и если вы заявите в плагине-дескрипторе

def loadAfter = ['hibernate'] 

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

+0

Ну, честно говоря, я бы НЕ создал/не поддерживал отдельный плагин только для запуска AMQ после загрузки спящего режима. Я уверен, что есть лучший способ. – Archer

+0

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

+0

У меня это получилось;) Но в любом случае - я бы не переместил один файл инициализации activemq.xml из основного приложения в другой «компонент» с полной структурой проекта плагина Grails, разместил его в svn и сохранил еще одну группу источников только для задержка AMQ инициализации. Простой способ. AMQ bean поддерживает свойство 'start', которое указывает, должно ли оно быть автозапущенным или нет. Будет использовать его как сейчас. – Archer

4

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

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

Это удостоверится anotherBean инициализируется перед activeMqBean

+0

Спасибо, Bonzo, но я знаю 'зависимо от' утверждения. К сожалению, это не сработает, поскольку инициализация Grails находится на другом слое, а затем Spring. Таким образом, просто нет компонента, от которого должна зависеть activemq. – Archer

3

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

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

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

+0

Это тоже не сработает, так как мой DAO-компонент наверняка запрошен до того, как загрузится спящий режим. – Archer

0

Я знаю, что этот вопрос довольно старый, но теперь я сталкиваюсь с той же проблемой в 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") 
Смежные вопросы