简体   繁体   English

Apache骆驼Junit保持上下文运行

[英]Apache camel Junit keep Context running

We have some JUnits for testing camel routes and business logic, at some point there is a need to have camel context running, until response response received from server for one of the JUnit tests. 我们有一些用于测试骆驼路线和业务逻辑的JUnit,有时需要运行骆驼上下文,直到对其中一个JUnit测试从服务器收到响应响应为止。 We are using CamelSpringTestSupport. 我们正在使用CamelSpringTestSupport。 The problem is, no other JUnits running after that. 问题是,此后没有其他JUnit运行。

MyTest.java is below MyTest.java在下面

import java.io.File;

import org.apache.activemq.camel.component.ActiveMQComponent;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;
import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class MyTest extends CamelSpringTestSupport{
    String prop1;   
    Main main;
    ActiveMQComponent jms;

    public void setUp() throws Exception {
        super.setUp();
        prop1 = context.resolvePropertyPlaceholders("{{prop1}}");        
        jms = (ActiveMQComponent) context.getComponent("jms");

        RouteBuilder builder = new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("fromUri")
                .log("Got a message")               
                .to("file://C:\\Temp\\tempfolder");         
            }
        };        
        main = new Main();               
        main.addRouteBuilder(builder);
        main.bind("jms", jms);
        // add event listener
        //main.addMainListener(new Events());
        // set the properties from a file
        //main.setPropertyPlaceholderLocations("example.properties");
        // run until you terminate the JVM
        System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");
        main.run();
    }

    @Override
    protected AbstractXmlApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("/yourcontext.xml");
    }

    @Test
    public void testMoveFile() throws Exception {
        // create a new file in the inbox folder with the name hello.txt and containing Hello World as body
        template.sendBodyAndHeader("file://C:\\targetIn", "Hello World", Exchange.FILE_NAME, "hello.txt");

        // wait a while to let the file be moved
        Thread.sleep(2000);

        // test the file was moved
        File target = new File("C:\\targetin\\hello.txt");
        assertTrue("File should have been moved", target.exists());

        // test that its content is correct as well
        String content = context.getTypeConverter().convertTo(String.class, target);
        assertEquals("Hello World", content);
    }

    @Test
    public void uploadData() throws Exception{  
        File target = new File("c:\\input.xml");
        assertTrue("File should have been moved", target.exists());

        template.sendBody(toUri, target);
    }
}

yourcontext.xml looks like below, i may be doing a basic mistake by having two context? yourcontext.xml如下所示,我可能是通过具有两个上下文而犯了一个基本错误?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:broker="http://activemq.apache.org/schema/core"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
         http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <context:component-scan base-package="com.yourpackage" />
    <bean id="properties" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
          <property name="ignoreResourceNotFound" value="true"/>
          <property name="locations">
            <list>
                <value>classpath:yourproperties.properties</value>                              
            </list>
        </property>
    </bean>


    <camel:camelContext id="mytest" useMDCLogging="true" threadNamePattern="#camelId#:#name#-##counter#">
        <camel:contextScan />
        <camel:jmxAgent id="agent" createConnector="false" />
        <camel:template id="camelTemplate" />
    </camel:camelContext>

    <bean id="shutdown" class="org.apache.camel.impl.DefaultShutdownStrategy">
        <property name="timeout" value="120" />
    </bean>

    <bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.spring.ActiveMQConnectionFactory">
                <property name="brokerURL" value="tcp://${activemq.host}:${activemq.port}" />
            </bean>
        </property>
    </bean>

</beans>

if that code snippet is a JUnit test, I'm not so sure why you'd annotate it with @Component. 如果该代码段是JUnit测试,则我不确定为什么要使用@Component对其进行注释。

Anyway, assuming you are using Spring, then the JUnit code should be using the spring support annotation, as follow: 无论如何,假设您使用的是Spring,那么JUnit代码应该使用spring支持注释,如下所示:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration
public class MyCamelTest {
    @Autowired
    protected CamelContext camelContext;

full sample: http://camel.apache.org/spring-testing.html 完整示例: http : //camel.apache.org/spring-testing.html

If you are using Spring Boot then here's the sample to get started: 如果您使用的是Spring Boot,那么下面是示例入门:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SpringBootApplication.class)
public class SpringBootCamelTest {

    @Autowired
    private CamelContext camelContext;

For a full sample: https://github.com/apache/camel/blob/master/examples/camel-example-spring-boot/src/test/java/sample/camel/SampleCamelApplicationTest.java 完整示例: https : //github.com/apache/camel/blob/master/examples/camel-example-spring-boot/src/test/java/sample/camel/SampleCamelApplicationTest.java

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM