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 解决了这个问题