有弹性的应用程序(实际上Grails的应用程序)运行Apache的ActiveMQ的服务器作为春豆和几个Apache的骆驼航线。应用程序使用hibernate来处理数据库。问题很简单。 Activemq +骆驼启动BEFORE
grails为hibernate域对象注入特殊方法(实际上保存/更新方法等)。所以,如果activemq在启动时已经有一些数据 - 骆驼开始处理没有注入grails DAO方法的消息。这失败grails.lang.MissingMethodException
。必须在Grails将特殊方法注入到域对象之前延迟activemq/camel启动。如何推迟spring beans的启动?
回答
如果所有这些被定义为春豆,你可以使用
<bean id="activeMqBean" depends-on="anotherBean" />
这将确保anotherBean
是activeMqBean
非常感谢Bonzo,但我知道'depends-on'语句。不幸的是,它不会工作,因为Grails初始化在Spring的某个不同的层上。所以没有那个activemq应该依赖的bean。 – Archer 2010-08-11 20:47:06
我不知道你的情况,但延迟加载还可以帮助如
<bean id="lazybean" class="com.xxx.YourBean" lazy-init="true">
一个懒惰初始化的bean向IoC容器指示在第一次请求时创建bean实例。这可以帮助你延迟加载你想要的bean。
这也不起作用,因为我的DAO bean肯定是在加载之前请求的。 – Archer 2010-08-12 11:33:38
我知道这个问题是很老,但我现在面临着同样的问题,在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")
- 1. Spring,XML beans在应用程序启动时调用Annotation beans
- 2. Spring beans下未显示Spring beans
- 3. 如何推迟一个函数的启动
- 4. Spring Beans在应用程序重新启动后生存吗?
- 5. 如何推迟/推迟Gearman工作?
- 6. 如何推迟我的AI移动
- 7. Spring Instantiation和'unused beans'
- 8. Spring Beans Profiles和OSGI
- 9. 如何阅读spring beans定义
- 10. Spring beans的标准命名
- 11. 加载多次的Spring beans
- 12. 如何将Spring Beans自动添加到TaskExecutor
- 13. Spring配置文件如何针对Spring beans XSD进行验证?
- 14. 如何在spring beans上强制执行/验证spring scope注释
- 15. spring autowire 2 beans found exception
- 16. 从jsp访问Spring beans
- 17. Intellij 13 JSF支持Spring Beans
- 18. Gson序列化Spring beans
- 19. 分享spring beans in teracotta
- 20. 在JerseyTest中访问Spring beans
- 21. Spring @Configuration Beans - '最佳'地点?
- 22. 在Spring中绑定Spring Beans到服务?
- 23. 推迟插件在Eclipse启动时自动加载/打开
- 24. 如何推迟内嵌Javascript?
- 25. 如何推迟ajax查询?
- 26. 启动QPropertyAnimation延迟
- 27. Rails启动延迟
- 28. 启动时延迟活动
- 29. 无法读取模式文档“http://www.springframework.org/schema/beans/spring-beans-3.2.3.xsd”
- 30. 从JBoss中的servlet访问Spring beans
那么,老实说,我不会创建/维护单独的插件只是为了在加载hibernate之后启动AMQ。我确信有更好的方法。 – Archer 2010-08-12 11:33:10
以及在grails插件是组件。我为应用程序开发了几个插件,只是因为我认为它们会更好地模块化。插件也是集成遗留数据或系统的有用方式。您在维护应用时维护它们。你不必将它们释放到野外。 – Sammyrulez 2010-08-13 07:20:00
我知道了;),但在任何情况下 - 我不动,从主应用程序单activemq.xml中初始化文件到另一个'component'完整的Grails插件的项目结构,它发布到SVN和维护的来源另一一堆刚延迟AMQ初始化。 有更简单的方法。 AMQ bean支持'start'属性,表示它是否应该自动启动。将现在使用它。 – Archer 2010-08-14 06:43:36