2012-02-07 3 views
2

"GET/files/x"와 같은 요청이 특정 디렉토리에서 "x"파일을 리턴 한 다음 삭제해야하는 CXFRS 엔드 포인트가 있습니다. 파일은 다른 프로세스에서 출력 된 다음이 경로를 통해 빠르게 소비됩니다. 따라서 필요할 경우 폴링하고 일시적으로 메모리에 보관하는 것이 허용 될 수 있습니다.Camel Request/Reply Correlation

아래는 제 웹 서비스입니다.

@Component 
@Path("/") 
public class WebService { 
@GET 
@Path("files/{id}") 
public String getFile(@PathParam("id") String id) { 
    return null; 
} 
} 

다음은 불완전한 경로입니다.

<route> 
<from uri="cxfrs://bean:webService"/> 
<choice> 
    <when> 
    <simple>${in.headers.operationName} == 'getFile'</simple> 
    <setHeader headerName="correlationId"> 
    <simple>mandatoryBodyAs(java.lang.String)</simple> 
    </setHeader> 
    ??? 
    </when> 
<choice> 
</route> 

나는 내용 enricher 패턴을 조사했지만, 원래의 교환이 enricher 내에서 소비자가 액세스 할 수 없기 때문에이 도움이되지 않습니다. 따라서 파일 이름은 입력 메시지에서 동적으로 결정될 수 없습니다. 즉, 파일 끝점에서 헤더를 볼 수 없으므로 아래 예제에서는 "x"파일을 읽지 않습니다.

...setHeader(Exchange.FILE_NAME, "x").pollEnrich("file://dir")... 

는 또한 다음과 같이 집계 전략, 웹 서비스 경로와 별도의 파일 경로 사이의 애그리 게이터 (aggregator) 패턴을 사용하려고했습니다.

@Component 
public class Aggregator implements AggregationStrategy { 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    if (oldExchange == null) { 
    return newExchange; 
    } else { 
    oldExchange.getOut().setBody(newExchange.getIn().getBody()); 
    return oldExchange; 
    } 
} 
} 

어 그리 게이터 패턴이 "전용"교환 용인 것처럼 보이기 때문에 이것은 작동하지 않습니다. "in out"교환을 사용하는 경우 메시지는 집계가 완료된 후에가 아니라 집계자가 도달하는 즉시 클라이언트에 반환됩니다. 그 후, 아래 프로세스를 작성했습니다.

@Component 
public class FileEnricher implements Processor { 

@Value("${folder}") 
private String folder; 

public void process(Exchange exchange) throws Exception { 

    Endpoint endpoint = exchange.getContext().getEndpoint(String.format(
    "file://%s?fileName=%s", 
    folder, 
    exchange.getIn().getHeader("correlationId") 
)); 
    PollingConsumer consumer = endpoint.createPollingConsumer(); 
    PollEnricher enricher = new PollEnricher(consumer); 
    enricher.setTimeout(10000); 

    consumer.start(); 
    enricher.process(exchange); 
    enricher.shutdown(); 
    consumer.stop(); 
} 
} 

이 프로세스는 콘텐츠 강화 프로그램을 동적으로 구성 할 수있게 해줍니다. 나는 그것을하는 더 좋은 방법이 없다고 믿기가 어렵습니다. 특히, 스레딩 및 지속적으로 컨텍스트에서 구성 요소/끝점 추가/제거에 대해 우려하고 있습니다.

누구든지이 문제에 대한 더 나은 해결책을 제안 할 수 있습니까?

+2

향후 Camel 버전에서 pollEnrich를 개선하기위한 JIRA 티켓이 있습니다. https://issues.apache.org/jira/browse/CAMEL-4163 –

답변

1

예를 들어 자바 빈과 같이 파일 본문을 java.io.File로 설정하여 풍성하게 만듭니다. 그리고 빈에 다음 메시지를 라우팅 : 낙타 경로에서 직접 할 쉬울 것이다 있도록 pollEnrich이 향상 될 것이다 향후

public File whichFileToPick(@Header("id") String id) { 
    return new File("somedir/" + id"); 
} 

. Christian은 pollEnrich의 uri로 낙타 식을 지정하도록 허용하는 좋은 아이디어를 생각해 냈습니다.