apache-camelcamel-http

Apache Camel: How to dynamically set header value in HTTP URI?


I'm learning Camel and created a route as follows:

from("timer:stream?period={{inbound.timer.period}}")
      ...
      .setHeader(Exchange.HTTP_URI, simple(outboundUri()))
      ...
      .multicast()
      .to(
              "stream:header",
              "file://build?autoCreate=false",
              outboundHttp
      );

The outboundUri() method returns a URI with a placeholder in the path, ${header.CamelFileName}. What I'd like to do is resolve this using a header mapper of some sort, where I can look at some headers in order of priority, and if none present, set a default value for CamelFileName.

How can I achieve this using the HTTP4 component?


Solution

  • I ended up implementing a Processor as follows:

    public class FilenameHeaderMessageProcessor implements org.apache.camel.Processor {
        private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd-kkmm");
    
        @Override
        public void process(Exchange exchange) throws Exception {
            Message in = exchange.getIn();
            Map<String, Object> inHeaders = in.getHeaders();
            log.debug("In headers: {}.", inHeaders);
    
            Message out = exchange.getOut();
    
            // Without this, out body is null
            out.setBody(in.getBody());
    
            Object filename = inHeaders.computeIfAbsent(FILE_NAME,
                    k -> Optional.ofNullable(inHeaders.get(KEY))
                            .orElse(defaultFilename())
            );
    
            out.setHeader(FILE_NAME, filename);
        }
    
        private final String defaultFilename() {
            return DATE_TIME_FORMATTER.format(LocalDateTime.now()) + ".out";
        }
    }