У меня есть конечная точка CXFRS, где такой запрос, как «GET /files/x», должен вернуть файл «x» из определенного каталога, а затем удалить его. Файлы выводятся из другого процесса, а затем быстро потребляются по этому маршруту. Таким образом, было бы приемлемо, если бы они были опрошены и временно сохранены в памяти.
Ниже мой веб-сервис.
@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>
Я исследовал шаблон обогащения контента, но это не поможет, потому что потребитель не может получить доступ к исходному обмену внутри расширителя. Таким образом, имя файла не может быть динамически определено из входного сообщения. Другими словами, в приведенном ниже примере файл «x» не будет прочитан, потому что конечная точка файла никогда не увидит заголовок.
...setHeader(Exchange.FILE_NAME, "x").pollEnrich("file://dir")...
Я также попытался использовать шаблон агрегатора между маршрутом веб-службы и отдельным файловым маршрутом со стратегией агрегации, показанной ниже.
@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();
}
}
Этот процесс не делает ничего, кроме как позволяет мне динамически настраивать средство обогащения контента. Мне трудно поверить, что нет лучшего способа сделать это. В частности, меня беспокоит многопоточность и постоянное добавление/удаление компонентов/конечных точек в контексте.
Может ли кто-нибудь предложить лучшее решение этой проблемы?