如何延迟spring beans启动?

时间:2010-08-11 16:00:29

标签: spring grails

使用spring应用程序(实际上是grails app)运行apache-activemq服务器作为spring bean和几个apache-camel路由。应用程序使用hibernate来处理数据库。问题很简单。 Activemq + Camel启动BEFORE grails为hibernate域对象注入特殊方法(实际上是保存/更新方法等)。因此,如果activemq在启动时已经有一些数据 - camel开始处理没有注入grails DAO方法的消息。这与grails.lang.MissingMethodException失败。必须在Grails将特殊方法注入域对象之前延迟activemq / camel启动。

4 个答案:

答案 0 :(得分:5)

如果将所有这些定义为spring bean,则可以使用

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

这将确保在anotherBean

之前初始化activeMqBean

答案 1 :(得分:4)

你可以将MQ管理移动到插件中吗?它会增加模块性,如果你在插件描述符中声明

def loadAfter = ['hibernate']

你应该有所需的行为。适用于JBPM plugin

答案 2 :(得分:3)

我不确定你的情况但延迟加载也可能有帮助,例如

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

一个延迟初始化的bean指示IoC容器在第一次请求时创建bean实例。这可以帮助您延迟加载所需的bean。

答案 3 :(得分:0)

我知道这个问题已经很老了,但我现在在2015年遇到了同样的问题 - 这个帖子并没有为我提供解决方案。

我想出了一个具有CountDownLatch的自定义处理器bean,我在引导应用程序后倒数。因此,消息将被闲置,直到应用程序完全启动并为我工作。

/**
 * 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()
     }
 }

然后在你的应用程序中将它用作bean并在你的Bootstrap.groovy中调用方法setBootstrapped

然后在您的RouteBuilder中,您将处理器放在终点和目的地之间,以便在应用程序启动之前预期消息会进入所有路由:

from("activemq:a.in ").processRef('bootstrapProcessor').to("bean:handlerService?method=handle")