2014-02-28 3 views
0

아파치 낙타 경로 : 경로 위Apache Camel은 중첩 된 경로를 지원합니까?

from("file:/tmp/test?include=.*.csv").process(new Processor() { 
     public void process(Exchange exchange) throws Exception { 
      // set output file name 
      exchange.setProperty("outputFile", exchange.getIn().getHeader(Exchange.FILE_NAME, String.class) + ".tmp." + exchange.getExchangeId()); 
     } 
    }).onCompletion().split().tokenize("\n", 100).process(new RequestProcessor()).to("direct:response").end().process(new Processor() { 
     public void process(Exchange exchange) throws Exception { 
      final String outputFile = exchange.getProperty("outputFile", String.class); 

      // add new rout to encrypt 
      CamelContext context = new DefaultCamelContext(); 
      context.addRoutes(new RouteBuilder() { 
       public void configure() { 

      from("file:/tmp/test/output?fileName=" + outputFile).marshal().pgp(keyFileName, keyUserid).to("file:/tmp/test/output?fileName=" + outputFile + ".pgp"); 
       } 
      }); 

      context.start(); 
      Thread.sleep(5000); 
      context.stop(); 
     } 
    }); 

    from("direct:response").to("file:/tmp/test/output?fileName=${header.outputFile}&fileExist=Append"); 

은 (일괄 처리) 덩어리로 큰 파일 분할을 처리하고 결과를 출력 파일을 생성한다. 일단 내가 암호화해야 출력 파일을 생성합니다. 그래서 onCompletion 파일 분할/프로세스 경로에 프로세서 내부에 NEW 경로를 추가했습니다. 그것은 작동하지만 좋은 디자인이 아니므로 (두 개의 컨텍스트가 관련되어 있고 명시 적으로 컨텍스트를 종료해야하기 때문에)

암호화 경로를 발사하는 적절한 방법을 제안 해 줄 수 있습니까?

답변

0

자주 제안되는 (또는 항상) 중첩 된 경로는 무시 될 수 있습니다. 아마도이 간단한 경로는 사용자의 요구 사항을 충족 :

@Override 
public void configure() throws Exception { 
    from("file:/tmp/test?include=.*.csv") 
     .split().tokenize("\n", 100) 
     .setProperty("outputFile", simple("${header.CamelFileName}.${exchangeId}.pgp")) 
     .log("The splitted body will be PGP encoded & written to file ${property.outputFile}") 
     .marshal().pgp("keyFileName", "keyUserid") 
     .to("file:/tmp/test/output?fileName=${property.outputFile}"); 
    } 
} 

없음 임시 파일이 기록됩니다,하지만 분할의 콘텐츠는 직접 메모리에 암호화됩니다.

편집 :

하나에 의해 하나 개의 파일을 처리하려면, 다음과 같이 보일 것이다 경로는 다음과 같습니다

@Override 
public void configure() throws Exception { 
    from("file:/tmp/test?include=.*.csv") 
     .setProperty("outputFile", simple("${header.CamelFileName}.${exchangeId}.pgp")) 
     .log("The body will be PGP encoded & written to file ${property.outputFile}") 
     .marshal().pgp("keyFileName", "keyUserid") 
     .to("file:/tmp/test/output?fileName=${property.outputFile}"); 
    } 
}  

먼저 다음 하나 개의 큰 파일로를 만들려면 원하는 경우 PGP가이 파일을 인코딩하면 메모리에있는 모든 입력 파일의 내용을 샘플링하는 aggregator을 사용할 수 있습니다. 물론 이것은 메모리 제약 조건이 허용하는 경우에만 가능합니다.

+0

는 너무 베드로 감사드립니다. 큰 도움이 ... – user3332279

+0

여전히 하나의 문제가 위의 솔루션으로 분할 크기를 기반으로 여러 파일을 만들 것입니다. 이것을 피하고 단일 파일로 암호화 할 수있는 방법은 무엇입니까? – user3332279

+0

@ user3332279 대답을 –

0

귀하의 의견을 반영하여 초기 디자인을 향상 시켰습니다. 그러나 암호화 경로는 원본 파일을 입력으로 가져오고 있으며 생성 된 출력 파일을 암호화 입력으로 리디렉션하는 메커니즘이 있습니다.

from("file:/tmp/test/input?include=.*.csv&noop=true") 
     .setProperty("outputFile", simple("${header.CamelFileName}.${exchangeId}")) 
     .onCompletion() 
      .split().tokenize("\n", 100) 
      .log("splitted body processed & written to file ${property.outputFile}.csv") 
      .process(new RequestProcessor()) 
      .to("file:/tmp/test/temp?fileName=${property.outputFile}.csv&fileExist=Append") 
     .end() 
     .marshal().pgp(keyFileName, keyUserid) 
     .log("PGP encrypted written to file ${property.outputFile}.pgp") 
     .to("file:/tmp/test/output?fileName=${property.outputFile}.pgp"); 

참고 : 의 RequestProcessor :

public class RequestProcessor implements Processor { 
public void process(Exchange exchange) throws Exception { 
String body = exchange.getIn().getBody(String.class); 
String[] split = body.split("\n"); 
StringBuilder output = new StringBuilder(); 

// TODO begin trx 

for (String input : split) { 
    if (input.startsWith("InputHeader")) { 
     output.append("OutputHeader").append(input.substring(11) + ","); 
    } else { 
     // TODO process here 
     output.append("\n").append(input).append(",DONE"); 
    } 
} 

// TODO commit trx 

DefaultMessage message = new DefaultMessage(); 
message.setBody(output.toString()); 

exchange.setOut(message); 

}

관련 문제