Camel - CSV标头设置不起作用

时间:2018-05-31 09:53:37

标签: csv apache-camel

我有没有标题的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中可能缺少什么?

1 个答案:

答案 0 :(得分:0)

方法1和方法2之间的最大区别在于范围。

在方法1中,您可以完全配置CSV数据格式。这是全部在创建Camel Context时完成,因为数据格式在Camel Context中共享。处理邮件时,所有邮件的配置相同

在方法2中,您只需全局配置基础知识。标头配置位于路径内,因此可以针对每条消息进行更改。每条消息都会覆盖上下文全局数据格式实例的标头配置。

我不确定这一点,我认为无法更改路径中的上下文全局DataFormat

当并行处理消息时,您会(例如)期望什么?他们会相互覆盖标头配置。

作为替代方案,您可以使用POJO,您可以从Java代码执行动态编组/解组。