Spring 开机骆驼测试
Spring Boot Camel Test
我正在使用 Spring 启动为 Camel 编写测试。
下面是测试配置 class
@RunWith(CamelSpringBootRunner.class)
@SpringBootApplication
@ComponentScan(basePackages = ["example.test"])
@UseAdviceWith
@BootstrapWith(SpringBootTestContextBootstrapper)
@DirtiesContext
class RouteTest {
private static final Logger LOGGER = LoggerFactory.getLogger(RouteTest.class)
@Autowired ModelCamelContext camelContext
@Test
void "flow"() {
camelContext.getRouteDefinition(route.routeId).adviceWith(camelContext, new AdviceWithRouteBuilder() {
@Override
void configure() throws Exception {
}
}
LOGGER.info("IN TEST: ******* Camel Status: "+camelContext.getStatus())
}
我预计骆驼不应该启动。但是当我运行测试时它已经开始了。
我注意到 CamelSpringBootRunner 确实在 CamelSpringBootExecutionListener 中启动了 camel 上下文。
如何强制不启动骆驼上下文。
在最新版本的camel 中,有一个camel 的自动启动选项。您可以通过添加 autoStartup 选项来实现您想要的。
例如,下面的路由配置为 autoStartup=false 以防止 Camel 在 Spring 启动时启动。
<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring" autoStartup="false">
<route>
<from uri="direct:start"/>
<to uri="mock:result"/>
</route>
</camelContext>
您可以稍后通过调用其启动方法手动启动 Camel,如下所示:
ApplicationContext ac = ...
SpringCamelContext camel = (SpringCamelContext) ac.getBean("myCamel");
// now start Camel manually
camel.start();
如果您使用的是旧版本的 camel,则 autoStartup 选项将不起作用,请尝试改用 shouldStartContext。
有时在设置 shouldStartContext 后启动 camel 不起作用,所以我在下面的示例中解决了这个问题。试试这个:
在从代码启动上下文之前手动设置 shouldStartContext:
((SpringCamelContext)camelContext).setShouldStartContext(true);
camelContext.start();
示例上下文:
<camel:camelContext id="ids.camel.context" shouldStartContext="false">
<!-- Queue endpoints. -->
<camel:endpoint id="defaultInQueue" uri="jms:queue:${default.in.queue.name}"/>
<camel:endpoint id="defaultOutQueue" uri="jms:queue:${default.out.queue.name}"/>
<!-- Route to send messages to IDS -->
<camel:route id="out" trace="true">
<camel:from uri="direct:sender"/>
<!-- Do not expect answer (fire and forget) -->
<camel:setExchangePattern pattern="InOnly"/>
<camel:to ref="defaultOutQueue"/>
</camel:route>
<!-- Route to receive -->
<camel:route id ="in" trace="true">
<camel:from ref="defaultInQueue"/>
<camel:to uri="bean:defaultTextAdapter?method=onMessage"/>
</camel:route>
</camel:camelContext>
使用 Camel 2.20.1 解决了这个问题
我正在使用 Spring 启动为 Camel 编写测试。 下面是测试配置 class
@RunWith(CamelSpringBootRunner.class)
@SpringBootApplication
@ComponentScan(basePackages = ["example.test"])
@UseAdviceWith
@BootstrapWith(SpringBootTestContextBootstrapper)
@DirtiesContext
class RouteTest {
private static final Logger LOGGER = LoggerFactory.getLogger(RouteTest.class)
@Autowired ModelCamelContext camelContext
@Test
void "flow"() {
camelContext.getRouteDefinition(route.routeId).adviceWith(camelContext, new AdviceWithRouteBuilder() {
@Override
void configure() throws Exception {
}
}
LOGGER.info("IN TEST: ******* Camel Status: "+camelContext.getStatus())
}
我预计骆驼不应该启动。但是当我运行测试时它已经开始了。
我注意到 CamelSpringBootRunner 确实在 CamelSpringBootExecutionListener 中启动了 camel 上下文。
如何强制不启动骆驼上下文。
在最新版本的camel 中,有一个camel 的自动启动选项。您可以通过添加 autoStartup 选项来实现您想要的。 例如,下面的路由配置为 autoStartup=false 以防止 Camel 在 Spring 启动时启动。
<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring" autoStartup="false">
<route>
<from uri="direct:start"/>
<to uri="mock:result"/>
</route>
</camelContext>
您可以稍后通过调用其启动方法手动启动 Camel,如下所示:
ApplicationContext ac = ...
SpringCamelContext camel = (SpringCamelContext) ac.getBean("myCamel");
// now start Camel manually
camel.start();
如果您使用的是旧版本的 camel,则 autoStartup 选项将不起作用,请尝试改用 shouldStartContext。 有时在设置 shouldStartContext 后启动 camel 不起作用,所以我在下面的示例中解决了这个问题。试试这个:
在从代码启动上下文之前手动设置 shouldStartContext:
((SpringCamelContext)camelContext).setShouldStartContext(true);
camelContext.start();
示例上下文:
<camel:camelContext id="ids.camel.context" shouldStartContext="false">
<!-- Queue endpoints. -->
<camel:endpoint id="defaultInQueue" uri="jms:queue:${default.in.queue.name}"/>
<camel:endpoint id="defaultOutQueue" uri="jms:queue:${default.out.queue.name}"/>
<!-- Route to send messages to IDS -->
<camel:route id="out" trace="true">
<camel:from uri="direct:sender"/>
<!-- Do not expect answer (fire and forget) -->
<camel:setExchangePattern pattern="InOnly"/>
<camel:to ref="defaultOutQueue"/>
</camel:route>
<!-- Route to receive -->
<camel:route id ="in" trace="true">
<camel:from ref="defaultInQueue"/>
<camel:to uri="bean:defaultTextAdapter?method=onMessage"/>
</camel:route>
</camel:camelContext>
使用 Camel 2.20.1 解决了这个问题