"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();
}
}
이 프로세스는 콘텐츠 강화 프로그램을 동적으로 구성 할 수있게 해줍니다. 나는 그것을하는 더 좋은 방법이 없다고 믿기가 어렵습니다. 특히, 스레딩 및 지속적으로 컨텍스트에서 구성 요소/끝점 추가/제거에 대해 우려하고 있습니다.
누구든지이 문제에 대한 더 나은 해결책을 제안 할 수 있습니까?
향후 Camel 버전에서 pollEnrich를 개선하기위한 JIRA 티켓이 있습니다. https://issues.apache.org/jira/browse/CAMEL-4163 –