Java 从Camel会话检索响应
我正在使用Camel制作CSV到对象的创建示例 我已经创建了一个bean,其中有一个方法将执行所有操作,该方法将返回List 我的问题是如何在骆驼之外获得列表 源代码: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
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服务,然后做一些工作,将两个操作中的数据合并在一起,然后调用其他操作并得到结果,这一切都是在路由中发生的。