我有没有标题的CSV文件。由于我正在使用'useMaps',我想动态指定标题。如果我静态设置标题然后在路由中使用它可以正常工作,如下面的方法1 -
@Component
public class BulkActionRoutes extends RouteBuilder {
@Override
public void configure() throws Exception {
CsvDataFormat csv = new CsvDataFormat(",");
csv.setUseMaps(true);
from("direct:bulkImport")
.convertBodyTo(String.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
ArrayList<String> fileHeaders = (ArrayList<String>)headers.get(Constants.FILE_HEADER_LIST);
if (fileHeaders != null && fileHeaders.size() > 0) {
csv.setHeader(fileHeaders);
}
}
})
.unmarshal(csv)
.split(body()).streaming()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
GenericObjectModel model = null;
HashMap<String, String> csvRecord = (HashMap<String, String>)exchange.getIn().getBody();
}
});
}
}
但是,如果列表通过Camel标头传递,如下所示,那么它不起作用方法2 -
private Class addAnnotation(String className,String annotationName, int frequency) throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass(className);
ClassFile classFile = ctClass.getClassFile();
ConstPool constpool = classFile.getConstPool();
AnnotationsAttribute annotationsAttribute = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
Annotation annotation = new Annotation(annotationName, constpool);
annotation.addMemberValue("frequency", new IntegerMemberValue(classFile.getConstPool(), frequency));
annotationsAttribute.setAnnotation(annotation);
ctClass.getClassFile().addAttribute(annotationsAttribute);
return ctClass.toClass();
}
方法2中可能缺少什么?
答案 0 :(得分:0)
方法1和方法2之间的最大区别在于范围。
在方法1中,您可以完全配置CSV数据格式。这是全部在创建Camel Context时完成,因为数据格式在Camel Context中共享。处理邮件时,所有邮件的配置相同。
在方法2中,您只需全局配置基础知识。标头配置位于路径内,因此可以针对每条消息进行更改。每条消息都会覆盖上下文全局数据格式实例的标头配置。
我不确定这一点,我认为无法更改路径中的上下文全局DataFormat 。
当并行处理消息时,您会(例如)期望什么?他们会相互覆盖标头配置。
作为替代方案,您可以使用POJO,您可以从Java代码执行动态编组/解组。