Apache camel Apache驼峰拆分器EIP组按

Apache camel Apache驼峰拆分器EIP组按,apache-camel,splitter,Apache Camel,Splitter,我有一个CSV文件的任务。我需要限制CSV的大小,因为后端引擎对有效负载大小有限制 问题是提取头,即第一条记录/行,保存它并将其添加回剩余的拆分数据,从而创建多个具有相同头的文件。我希望找到一种处理这件事的优雅方式。我所拥有的工作,但它是好的,不理想的编码 另外,我需要parm的group是可编程的,我现在试图找出它是否可以由上下文中的属性设置 这就是我所拥有的,它是有效的,但是。。。我无法让groupBy接受参数 我的路线 <!-- route on Weekends -->

我有一个CSV文件的任务。我需要限制CSV的大小,因为后端引擎对有效负载大小有限制

问题是提取头,即第一条记录/行,保存它并将其添加回剩余的拆分数据,从而创建多个具有相同头的文件。我希望找到一种处理这件事的优雅方式。我所拥有的工作,但它是好的,不理想的编码

另外,我需要parm的group是可编程的,我现在试图找出它是否可以由上下文中的属性设置

这就是我所拥有的,它是有效的,但是。。。我无法让groupBy接受参数

我的路线

<!--  route on Weekends -->
    <route id="inRouteWkEndBfmt1" routePolicyRef="startPolicyWkEnd" autoStartup="false" >
    <from id="mainProcessingRouteWkEnd" ref="AsciiGatewayBackfillmt1" />
    <convertBodyTo type="java.lang.String" />
    <log message="File ${file:name} was received."/>
    <setHeader headerName="messageDateTime">
      <simple>${date:now:MM-dd-yyyy-HH:mm:ss}</simple>
    </setHeader>
    <split streaming="true" >
    <tokenize token="\n" group="50"/>
        <log message="Split line Body: ${body}"/>
        <process ref="asciiSplitterProcessor" />
        <log loggingLevel="INFO" message="Successfully sent ${file:name} to MT1 Core for Analytics Observation." />
        <to id="windowsShareTargetWkEnd" uri="file://{{target.folder}}" />   
    </split>
    <process ref="asciiCleanUp" />
 </route>

我认为这比上面的更为冗长。不幸的是,我不是骆驼2.9。但这适用于需要在服务器端连接的子工作单元,用于CSV的大型有效负载,我将转换为Json并发送到服务器

谢谢大家。希望这能帮助其他人使用这个用例

    public void process(Exchange exchange) throws Exception {

    log.info("Entering Extract Header Processor ...");

        //if file is split in to multiple files modify the name with an index 
        String fileName = (String) exchange.getIn().getHeader("CamelFileName");
        String fileSuffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
        String filePrefix = fileName.substring(0, fileName.lastIndexOf("."));
        fileName = filePrefix + "_" + fileCounter + fileSuffix;
        fileCounter++;
        //fileName = filePrefix + "_" + Integer.valueOf((int)exchange.getProperty("CamelSplitSize")) + fileSuffix;  // need camel 2.9 for this to work, bummer
        exchange.getIn().setHeader("CamelFileName",fileName);
        log.info(" FILE NAME: " + exchange.getIn().getHeader("CamelFileName", fileName));
        //log.info("File Counter: " + Integer.valueOf((int)exchange.getProperty("CamelSplitSize"))); // need camel 2.9 for this to work, bummer
        log.info("File Counter: " + fileCounter ); 

        //if this is the first split body, get the header to attach to the other split bodies
        String body = exchange.getIn().getBody(String.class);       
        StringBuilder sb = new StringBuilder();

        if ( (Integer.valueOf((int)exchange.getProperty("CamelSplitIndex")) == 0 ) ) {
            List<String> serviceRecords = new ArrayList<String>(Arrays.asList(body.split(System.lineSeparator())));
            StringBuilder header = getHeader( serviceRecords );
            HEADER = header.toString();
            exchange.getIn().setBody(body);
        } else {
            sb.append(HEADER).append(System.lineSeparator()).append(body);
            exchange.getIn().setBody(sb.toString());
        }
        sb = new StringBuilder();
        log.debug("HEADER: " + HEADER);
        log.info("Exiting Extract Header Processor ... :: Finish");
  }

    public StringBuilder getHeader(List<String> serviceRecords) {
        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i < 1; i++ ) {
            log.debug("record: : " + serviceRecords.get(i).toString());
            if ( i == 0 ) {
                String[] sa = serviceRecords.get(i).toString().split(",");
                for ( int j = 0; j < sa.length; ++j) {
                    if ( j != 0 ) {
                        sb.append(sa[j]).append(",");
                    }
                }
                sb.deleteCharAt(sb.lastIndexOf(",", sb.length())); 
            } else {
                break;
            }
        }
        return sb;
    }

    public void cleanHeader() {
        HEADER = "";
        fileCounter = 0;
    }

}
公共作废进程(Exchange)引发异常{
log.info(“正在输入提取头处理器…”);
//如果文件拆分为多个文件,请使用索引修改名称
字符串文件名=(字符串)exchange.getIn().getHeader(“CamelFileName”);
字符串fileSuffix=fileName.substring(fileName.lastIndexOf(“.”),fileName.length();
字符串filePrefix=fileName.substring(0,fileName.lastIndexOf(“.”);
fileName=filePrefix+“”+fileCounter+fileSuffix;
fileCounter++;
//fileName=filePrefix+“”+Integer.valueOf((int)exchange.getProperty(“camelspitsize”))+fileSuffix;//需要camel 2.9才能工作,bummer
exchange.getIn().setHeader(“CamelFileName”,fileName);
log.info(“文件名:”+exchange.getIn().getHeader(“CamelFileName”,fileName));
//log.info(“文件计数器:”+Integer.valueOf((int)exchange.getProperty(“camelspitsize”));//需要camel 2.9才能工作,bummer
log.info(“文件计数器:”+fileCounter);
//如果这是第一个拆分实体,则获取要附加到其他拆分实体的标题
String body=exchange.getIn().getBody(String.class);
StringBuilder sb=新的StringBuilder();
if((Integer.valueOf((int)exchange.getProperty(“CamelSplitIndex”))==0)){
List serviceRecords=new ArrayList(Arrays.asList(body.split(System.lineSeparator()));
StringBuilder标头=getHeader(serviceRecords);
HEADER=HEADER.toString();
exchange.getIn().setBody(body);
}否则{
sb.append(HEADER.append(System.lineSeparator()).append(body);
exchange.getIn().setBody(sb.toString());
}
sb=新的StringBuilder();
log.debug(“头:”+头);
log.info(“正在退出提取头处理器…::完成”);
}
公共StringBuilder getHeader(列出服务记录){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<1;i++){
log.debug(“记录::”+serviceRecords.get(i.toString());
如果(i==0){
字符串[]sa=serviceRecords.get(i).toString().split(“,”);
对于(int j=0;j
路线


${header.CamelFileName}regex'^.*\.(csv | csv)$'
${header.CamelFileName}regex'^.*\.(CSV)$'
${file:name.noext}.csv
    public void process(Exchange exchange) throws Exception {

    log.info("Entering Extract Header Processor ...");

        //if file is split in to multiple files modify the name with an index 
        String fileName = (String) exchange.getIn().getHeader("CamelFileName");
        String fileSuffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
        String filePrefix = fileName.substring(0, fileName.lastIndexOf("."));
        fileName = filePrefix + "_" + fileCounter + fileSuffix;
        fileCounter++;
        //fileName = filePrefix + "_" + Integer.valueOf((int)exchange.getProperty("CamelSplitSize")) + fileSuffix;  // need camel 2.9 for this to work, bummer
        exchange.getIn().setHeader("CamelFileName",fileName);
        log.info(" FILE NAME: " + exchange.getIn().getHeader("CamelFileName", fileName));
        //log.info("File Counter: " + Integer.valueOf((int)exchange.getProperty("CamelSplitSize"))); // need camel 2.9 for this to work, bummer
        log.info("File Counter: " + fileCounter ); 

        //if this is the first split body, get the header to attach to the other split bodies
        String body = exchange.getIn().getBody(String.class);       
        StringBuilder sb = new StringBuilder();

        if ( (Integer.valueOf((int)exchange.getProperty("CamelSplitIndex")) == 0 ) ) {
            List<String> serviceRecords = new ArrayList<String>(Arrays.asList(body.split(System.lineSeparator())));
            StringBuilder header = getHeader( serviceRecords );
            HEADER = header.toString();
            exchange.getIn().setBody(body);
        } else {
            sb.append(HEADER).append(System.lineSeparator()).append(body);
            exchange.getIn().setBody(sb.toString());
        }
        sb = new StringBuilder();
        log.debug("HEADER: " + HEADER);
        log.info("Exiting Extract Header Processor ... :: Finish");
  }

    public StringBuilder getHeader(List<String> serviceRecords) {
        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i < 1; i++ ) {
            log.debug("record: : " + serviceRecords.get(i).toString());
            if ( i == 0 ) {
                String[] sa = serviceRecords.get(i).toString().split(",");
                for ( int j = 0; j < sa.length; ++j) {
                    if ( j != 0 ) {
                        sb.append(sa[j]).append(",");
                    }
                }
                sb.deleteCharAt(sb.lastIndexOf(",", sb.length())); 
            } else {
                break;
            }
        }
        return sb;
    }

    public void cleanHeader() {
        HEADER = "";
        fileCounter = 0;
    }

}
<route 
    id="core.accept.file.type.route"
    autoStartup="true" >
    <from uri="{{fileEntranceEndpoint}}" />
    <choice>
        <when>
            <simple>${header.CamelFileName} regex '^.*\.(csv|CSV)$'</simple>
            <log message="${file:name} accepted for processing..." />
            <choice>
              <when>
                <simple>${header.CamelFileName} regex '^.*\.(CSV)$'</simple>
                <setHeader headerName="CamelFileName">
                    <simple>${file:name.noext}.csv</simple>
                </setHeader>                    
              </when>
            </choice>

            <split streaming="true" >
            <tokenize token="\n" group="600" />
            <log message="Split Group Body: ${body}"/>
                <to uri="bean:extractHeader" />
                <to id="acceptedFileType" ref="pConsumer" /> 
            </split>
            <to uri="bean:extractHeader?method=cleanHeader"/>
            <!-- <to id="acceptedFileType" ref="pConsumer" />  -->
        </when>
        <otherwise>  
            <log message="${file:name} is an unknown file type, sending to unhandled repo." loggingLevel="INFO" />
            <to uri="{{unhandledArchive}}" />
        </otherwise>
    </choice>
</route>