Anirban
Anirban

Reputation: 949

Dynamic to() in Apache Camel Route

I am writing a demo program using Apache Camel. Out Camel route is being called from a Spring Boot scheduler and it will transfer file from the source directory C:\CamelDemo\inputFolder to the destination directory C:\CamelDemo\outputFolder

The Spring Boot scheduler is as under

@Component
public class Scheduler {

    @Autowired
    private ProducerTemplate producerTemplate;

    @Scheduled(cron = "#{@getCronValue}")
    public void scheduleJob() {
        System.out.println("Scheduler executing");
        String inputEndpoint = "file:C:\\CamelDemo\\inputFolder?noop=true&sendEmptyMessageWhenIdle=true";
        String outputEndpoint = "file:C:\\CamelDemo\\outputFolder?autoCreate=false";

        Map<String, Object> headerMap = new HashMap<String, Object>();
        headerMap.put("inputEndpoint", inputEndpoint);
        headerMap.put("outputEndpoint", outputEndpoint);

        producerTemplate.sendBodyAndHeaders("direct:transferFile", null, headerMap);
        System.out.println("Scheduler complete");
    }
}

The Apache Camel route is as under

@Component
public class FileTransferRoute extends RouteBuilder {

    @Override
    public void configure() {
        errorHandler(defaultErrorHandler()
            .maximumRedeliveries(3)
            .redeliverDelay(1000)
            .retryAttemptedLogLevel(LoggingLevel.WARN));

        from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\CamelDemo\\outputFolder?autoCreate=false")
    }
}

When I am commenting out the line for recipientList() and uncommenting the to() i.e. givig static endpoint in to(), the flow is working. But when I am commenting to() and uncommenting recipientList(), it is not working. Please help how to route the message to the dynamic endpoint (outputEndpoint)?

Upvotes: 0

Views: 376

Answers (1)

M.Ricciuti
M.Ricciuti

Reputation: 12086

You are using pollEnrich without specifying an AggregationStrategy: in this case, Camel will create a new OUT message from the retrieved resource, without combining it to the original IN message: this means you will lose the headers previously set on the IN message.

See documentation : https://camel.apache.org/manual/latest/enrich-eip.html#_a_little_enrich_example_using_java

strategyRef Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message.

A simple solution would be to define a simple AggregationStrategy on your pollEnrich component, which simply copies headers from the IN message to the new OUT message (note that you will then use the original IN message body, but in your case it's not a problem I guess)

    from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .aggregationStrategy((oldExchange, newExchange) -> {
                // Copy all headers from IN message to the new OUT Message
                newExchange.getIn().getHeaders().putAll(oldExchange.getIn().getHeaders());
                return newExchange;
            })
            .log("Output Endpoint (after pollEnrich): ${in.headers.outputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\var\\CamelDemo\\outputFolder?autoCreate=false");

Upvotes: 1

Related Questions