Java 从Camel会话检索响应

Java 从Camel会话检索响应,java,csv,apache-camel,Java,Csv,Apache Camel,我正在使用Camel制作CSV到对象的创建示例 我已经创建了一个bean,其中有一个方法将执行所有操作,该方法将返回List 我的问题是如何在骆驼之外获得列表 源代码: public class Person { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void

我正在使用Camel制作CSV到对象的创建示例

我已经创建了一个bean,其中有一个方法将执行所有操作,该方法将返回List

我的问题是如何在骆驼之外获得列表

源代码:

public class Person {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.firstName + "===" + this.lastName;
    }
}



public class UnMarshallingTest {

    public static void main(String[] args) throws Exception {
        DefaultCamelContext context = new DefaultCamelContext();
        // append the routes to the context
        context.addRoutes(new UnMarshallingTestRoute());

        CSVToPerson csvToPerson = new CSVToPerson();
        SimpleRegistry reg = new SimpleRegistry();
        reg.put("csvToPerson", csvToPerson);
        context.setRegistry(reg);
        context.start();
        Thread.sleep(3000);
        System.out.println("Done");
        context.stop();

    }

}




public class UnMarshallingTestRoute extends RouteBuilder {


    public void configure() throws Exception {
        from("file:/home/viral/Projects/camel/cxfJavaTest/src/data?noop=true")           
            .unmarshal().csv()
            .beanRef("csvToPerson", "process");
    }
}



public class CSVToPerson {

    public List<Person> process(List<List> csvRows) {
        List<Person> oList = new ArrayList<Person>();
        System.out.println("called");
        for (List csvRow : csvRows) {
            Person person = new Person();
            person.setFirstName((String) csvRow.get(0));
            person.setLastName((String) csvRow.get(1));
            oList.add(person);
            // doSomethingTo(person);
            System.out.println("++++++++++++++++++++++++++");
            System.out.println(person);
            System.out.println("++++++++++++++++++++++++++");
        }
        System.out.println("End");
        return oList;
    }
}
公共类人物{
私有字符串名;
私有字符串lastName;
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
@凌驾
公共字符串toString(){
//TODO自动生成的方法存根
返回this.firstName+“==”+this.lastName;
}
}
公共类解组测试{
公共静态void main(字符串[]args)引发异常{
DefaultCamelContext=新的DefaultCamelContext();
//将路由附加到上下文中
addRoutes(新的UnMarshallingTestRoute());
CSVToPerson CSVToPerson=新的CSVToPerson();
SimpleRegistry reg=新建SimpleRegistry();
注册put(“csvToPerson”,csvToPerson);
setRegistry(reg);
context.start();
睡眠(3000);
系统输出打印项次(“完成”);
context.stop();
}
}
公共类解组发送路由扩展RouteBuilder{
public void configure()引发异常{
from(“文件:/home/viral/Projects/camel/cxfJavaTest/src/data?noop=true”)
.unmarshal().csv()
.beanRef(“csvToPerson”、“过程”);
}
}
公共类CSV操作器{
公共列表流程(列表csvRows){
List-oList=new-ArrayList();
System.out.println(“被调用”);
对于(列表csvRow:csvRows){
Person=新人();
person.setFirstName((字符串)csvRow.get(0));
person.setLastName((字符串)csvRow.get(1));
增加(人);
//doSomethingTo(人);
System.out.println(“+;
系统输出打印项次(人);
System.out.println(“+;
}
系统输出打印项次(“结束”);
回归寡头;
}
}

我只有一个骆驼上下文对象,我如何才能从上下文对象中获取列表。

我找到了上述问题的一个答案

public class UnMarshallingTest {

    public static void main(String[] args) throws Exception {
        DefaultCamelContext context = new DefaultCamelContext();
        // append the routes to the context
        context.addRoutes(new UnMarshallingTestRoute());

        //CSVToPerson csvToPerson = new CSVToPerson();
        //SimpleRegistry reg = new SimpleRegistry();
        //reg.put("csvToPerson", csvToPerson);
        //context.setRegistry(reg);

        context.start();

        ConsumerTemplate ct = context.createConsumerTemplate();

        List data = (List<Person>)ct.receiveBody("seda:foo", 5000);

        System.out.println("=================================");
        System.out.println("Return Value::::" + data);
        System.out.println("=================================");

        Thread.sleep(3000);

        context.stop();

    }
}

public class UnMarshallingTestRoute extends RouteBuilder {


    public void configure() throws Exception {
        from("file:/home/viral/Projects/camel/cxfJavaTest/src/data?noop=true")
          .split(body().tokenize("\n")).streaming()
            .unmarshal().csv()
            .bean(CSVToPerson.class).to ("seda:foo") ;
    }
}
公共类解组测试{
公共静态void main(字符串[]args)引发异常{
DefaultCamelContext=新的DefaultCamelContext();
//将路由附加到上下文中
addRoutes(新的UnMarshallingTestRoute());
//CSVToPerson CSVToPerson=新的CSVToPerson();
//SimpleRegistry reg=新建SimpleRegistry();
//注册put(“csvToPerson”,csvToPerson);
//setRegistry(reg);
context.start();
ConsumerTemplate ct=context.createConsumerTemplate();
列表数据=(列表)ct.receiveBody(“seda:foo”,5000);
System.out.println(“=======================================================”);
System.out.println(“返回值:”+数据);
System.out.println(“=======================================================”);
睡眠(3000);
context.stop();
}
}
公共类解组发送路由扩展RouteBuilder{
public void configure()引发异常{
from(“文件:/home/viral/Projects/camel/cxfJavaTest/src/data?noop=true”)
.split(body().tokenize(“\n”)).streaming()
.unmarshal().csv()
.bean(CSVToPerson.class).to(“seda:foo”);
}
}

对于消费响应,我使用seda。然后在执行路由后,我使用了相同的方法,我得到了
列表

通常您会在路由的末尾添加一个
.to()
,以便将消息发送到需要发送的地方(文件、web服务、电子邮件等)是的,我知道,但我需要在UnMarshallingTest.Class main方法中获取该列表,以便我能够对该列表执行一些业务逻辑。不,您应该将您的业务登录放到bean中(或者为其创建一个处理器)。camel背后的整个想法是,您的路由连接两个端点,并在过程中应用各种规则和处理。因此,所有需要对消息执行的工作都应该发生在路由内部。我不这么认为,例如,我想在没有输入的情况下调用web服务,但它将返回列表,因此我可以如何执行该操作。我需要将此列表发送到调用程序。根据您的描述,这是不可能的,因为我们正在使用camel调用web服务,并尝试将输出发送到调用方程序。因此这是不可能的???您的camel路由也将调用web服务。将camel视为类似servlet引擎的容器。您需要做的每件事都是在骆驼路线作为交换的背景下进行的。因此,如果您需要获取一个文件,然后调用一个web服务,然后做一些工作,将两个操作中的数据合并在一起,然后调用其他操作并得到结果,这一切都是在路由中发生的。