Search code examples
javaspringconfigurationsftpspring-camel

Camel sftp producer. How to put multiple files to different sftp folders from single processor


I use DSL configuration and spring.

My route looks like this:

@Component
public class UploadRoutesDefinition extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("seda:rest_upload")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) {
                    ...
                    String sftPathForAdditionalFile = ....
                    String AdditionalFileContent = ...
                    ...
                }
             ).to(String.format(SFTP_BASE_URL,systemSettingsService.getSystemSettings().getSftpUserName(),
                    systemSettingsService.getSystemSettings().getSftpHost(),
                    systemSettingsService.getSystemSettings().getSftpPort(),
                    systemSettingsService.getSystemSettings().getSftpAttachmentsPushFailedPath(),
                    systemSettingsService.getSystemSettings().getSftpPassword()))

It allows me to read file from seda:rest_upload and then move it to the sftp folder.

I want to move one more file additionally. I know path and content inside process method.

How can I achieve it?

UPDATE

my current code;

.process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    exchange.getIn().setHeader("CamelFilename", "ololo.txt");
                    exchange.getIn().setBody(exchange.getProperty(PUSH_ERROR_MESSAGE, String.class).getBytes());
                    exchange.getIn().setHeader("destFilePath", sftpErrorFileTextPath);
                }
            })
            .to(String.format(SFTP_BASE_URL + "&fileExist=Append",
                    systemSettingsService.getSystemSettings().getSftpUserName(),
                    systemSettingsService.getSystemSettings().getSftpHost(),
                    systemSettingsService.getSystemSettings().getSftpPort(),
                    "${header.destFilePath}",
                    systemSettingsService.getSystemSettings().getSftpPassword()))
            .end();

Solution

  • Here is one way to do it,

    @Override
    public void configure() throws Exception {
    
    
    from("seda:rest_upload")
     .multicast()
     .to("direct::sendMainFile")
     .to("direct:sendAnotherFile") // You could also use seda:
     .end();
    
    
    
    from("direct:sendMainFile")
    .process(new Processor() {
     @Override
          public void process(Exchange exchange) throws Exception {
            String filepath = <calculate filepath>;
            String completeFilePath = systemSettingsService.getSystemSettings().getSftpAttachmentsPushFailedPath() + filepath
            exchange.getIn().setHeader("destFilePath", completeFilePath);
             exchange.getIn().setHeader("CamelFileName", fileNameforMainFile);
        }
     }.toD(sftpRoute()) // It is toD not to
    
    
    from("direct:sendAnotherfile")
    .process(new Processor() {
              @Override
              public void process(Exchange exchange) throws Exception {
                // Here you have the same body which was sent from rest_upload
                // extract the info from exchange.getIn().getBody() 
                // Read the file and set it as exchange body
    
                String fileContent = <Your logic to read file>
                exchange.getIn().setBody(fileContent);
                exchange.getIn().setHeader("CamelFileName", fileNameforYourAdditionalFile)
    
                String completeFilePath = systemSettingsService.getSystemSettings().getSftpAttachmentsPushFailedPath() + filepath
                exchange.getIn().setHeader("destFilePath", completeFilePath);
              }
            })
     .toD(sftpRoute());  // It is toD not to
    
    }    
    
    private String sftpRoute() {
    
     return String.format(SFTP_BASE_URL,systemSettingsService.getSystemSettings().getSftpUserName(),               
      systemSettingsService.getSystemSettings().getSftpHost(),
      systemSettingsService.getSystemSettings().getSftpPort(),
                    "${header.destFilePath}",                  
      systemSettingsService.getSystemSettings().getSftpPassword())
      }
     }