如何在Spring ApplicationContext中使用NotifyBuilder

时间:2014-12-11 15:30:28

标签: spring apache-camel

简单的问题我猜,但我还没找到答案。

骆驼很新,我正在尝试使用'最佳实践',因此我  “在Spring中启动CamelContext并在Java DSL RouteBuilders中编写路由规则”。

所以我有:

ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/camel-context.xml"); 

我现在正在尝试使用NotifyBuilder:

 NotifyBuilder notify = new NotifyBuilder().whenDone(1).create();

NotifyBuilder需要参数中的上下文,但不接受'Application context'或cast()。 我试着将getContext()作为参数,然后是我的布尔值:

boolean done = notify.matches(10, TimeUnit.SECONDS);

总是假的......

那么我如何使用NotifyBuilder和Spring定义上下文呢? 非常感谢你的时间。

3 个答案:

答案 0 :(得分:0)

您可以使用标准的spring api来使用getBean api

获取camel上下文

的长篇大论
CamelContext camel = context.getBean("idOfCamelContext", CamelContext.class);

例如,检查ApplicationContext

上的api

如果您使用<camelContext>

,则bean的id是您在xml文件中设置的id属性
<camelContext id="idOfCamelContext" ...>

答案 1 :(得分:0)

在发送正文之前创建NotifyBuilder实例

CamelContext camelContext = ...
ProducerTemplate template = ...

NotifyBuilder notifyBefore = new NotifyBuilder(camelContext)
            .from("direct:start").whenDone(1)
            .create();

template.sendBody("direct:start", "Wow!!!!");

NotifyBuilder notifyAfter = new NotifyBuilder(camelContext)
            .from("direct:start").whenDone(1)
            .create();

LOG.info("done (before) = {}", notifyBefore.matches(1, TimeUnit.SECONDS));
LOG.info("done (after)  = {}", notifyAfter.matches(1, TimeUnit.SECONDS));

打印:

INFO  done (before) = true
INFO  done (after)  = false

答案 2 :(得分:0)

非常感谢回复家伙们。我很惭愧要求更多,但我显然错过了一些东西。

我正在使用

运行我的应用程序
camel:run

作为maven的目标。如果我做对了,它会从我的“META-INF / spring / camel-context.xml”文件中自动启动驼峰上下文。

所以这一行:

ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/camel-context.xml"); 

没用,因为程序从未进入主程序。 得到之后,我试着:

-Apply Claus回答获取我的ApplicationContext上下文,然后使用

设置常规CamelContext
CamelContext camel = context.getBean("idOfCamelContext", CamelContext.class);

在另一个bean文件或路由中。当我这样做时,ClassPathXmlApplicationContext会不断刷新,一遍又一遍,之后什么也没发生。

- 用

改变我的mvn目标
compile exec:java -Dexec.mainClass=com.blabla.MyMain

然后使用id技巧在我的main方法applicationContext和camelContext中设置。 但是路由是在设置camelContext之前启动的,我仍然不能使用notifyBuilder(camelContext),因为那时它是null。所以我现在无法测试彼得的答案。

如果这是一个愚蠢的问题,我很抱歉:-)。我可以使用完整的JavaDSL,但我真的不知道Spring是如何运行的。 (非真正相关,但我甚至无法控制如何使用Spring启动和停止上下文,而在纯JavaDSL中我们可以这样做):

context.start()
thread.sleep(10000)
context.stop()    

再次感谢您的时间。