2010-08-11 36 views
7

有弹性的应用程序(实际上Grails的应用程序)运行Apache的ActiveMQ的服务器作为春豆和几个Apache的骆驼航线。应用程序使用hibernate来处理数据库。问题很简单。 Activemq +骆驼启动BEFORE grails为hibernate域对象注入特殊方法(实际上保存/更新方法等)。所以,如果activemq在启动时已经有一些数据 - 骆驼开始处理没有注入grails DAO方法的消息。这失败grails.lang.MissingMethodException。必须在Grails将特殊方法注入到域对象之前延迟activemq/camel启动。如何推迟spring beans的启动?

回答

4

之前,你可以移动MQ同治成插件初始化?它会增加模块性,如果你声明插件描述符

def loadAfter = ['hibernate'] 

你应该有理想的行为。作品JBPM plugin

+0

那么,老实说,我不会创建/维护单独的插件只是为了在加载hibernate之后启动AMQ。我确信有更好的方法。 – Archer 2010-08-12 11:33:10

+0

以及在grails插件是组件。我为应用程序开发了几个插件,只是因为我认为它们会更好地模块化。插件也是集成遗留数据或系统的有用方式。您在维护应用时维护它们。你不必将它们释放到野外。 – Sammyrulez 2010-08-13 07:20:00

+0

我知道了;),但在任何情况下 - 我不动,从主应用程序单activemq.xml中初始化文件到另一个'component'完整的Grails插件的项目结构,它发布到SVN和维护的来源另一一堆刚延迟AMQ初始化。 有更简单的方法。 AMQ bean支持'start'属性,表示它是否应该自动启动。将现在使用它。 – Archer 2010-08-14 06:43:36

4

如果所有这些被定义为春豆,你可以使用

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

这将确保anotherBeanactiveMqBean

+0

非常感谢Bonzo,但我知道'depends-on'语句。不幸的是,它不会工作,因为Grails初始化在Spring的某个不同的层上。所以没有那个activemq应该依赖的bean。 – Archer 2010-08-11 20:47:06

3

我不知道你的情况,但延迟加载还可以帮助如

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

一个懒惰初始化的bean向IoC容器指示在第一次请求时创建bean实例。这可以帮助你延迟加载你想要的bean。

+0

这也不起作用,因为我的DAO bean肯定是在加载之前请求的。 – Archer 2010-08-12 11:33:38

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

然后用它作为你的应用程序中的bean并调用你BootStrap.groovy中

然后在你的RouteBuilder你把你的处理器的终端和目的地之间setBootstrapped的方法,你希望未来的消息的所有路由在应用程序启动之前:

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