Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何延迟SpringBeans的启动?_Spring_Grails - Fatal编程技术网

如何延迟SpringBeans的启动?

如何延迟SpringBeans的启动?,spring,grails,Spring,Grails,使用spring应用程序(实际上是grails应用程序)作为Springbean运行ApacheActiveMQ服务器和两个ApacheCamel路由。应用程序使用hibernate处理数据库。问题很简单。Activemq+Camel在grails将特殊方法注入hibernate域对象(实际上是保存/更新方法等)之前启动。因此,如果activemq在启动时已经有一些数据,那么camel开始处理消息,而不注入grails DAO方法。这在grails.lang.MissingMethodExcep

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

如果所有这些都定义为Springbean,那么您可以使用

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


这将确保在
activeMqBean

将MQ管理移动到插件中之前初始化另一个bean
?它将增加模块性,如果您在插件描述符中声明

def loadAfter = ['hibernate']

你应该有想要的行为。对于你的情况我不确定,但是延迟加载也可能有帮助,例如

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


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

我知道这个问题已经很老了,但我现在在2015年面临着同样的问题——而这个帖子并没有为我提供解决方案

我提出了一个具有倒计时锁存器的定制处理器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")

谢谢Bonzo,但我知道
取决于
声明。不幸的是,它将无法工作,因为Grails初始化在与Spring不同的层上。所以activemq不应该依赖任何bean。老实说,我不会在加载hibernate后创建/维护单独的插件来启动AMQ。我确信有更好的方法。在grails中插件是组件。我开发了几个应用程序插件,只是因为我认为它们可以更好地模块化。插件也是集成遗留数据或系统的有用方法。您可以在维护应用程序时维护它们。你不必把它们放归野外,我知道了;)但在任何情况下,我都不会将单个activemq.xml初始化文件从主应用程序移动到另一个具有完整grails插件项目结构的
组件中,将其发布到svn并维护另一组源代码,只是为了延迟AMQ初始化。有更简单的方法。AMQbean支持
start
属性,该属性指示是否应自动启动。这也不起作用,因为我的DAOBean肯定是在加载hibernate之前被请求的。