使用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启动。
答案 0 :(得分:5)
如果将所有这些定义为spring bean,则可以使用
<bean id="activeMqBean" depends-on="anotherBean" />
这将确保在anotherBean
activeMqBean
答案 1 :(得分:4)
答案 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")