Search code examples
spring-integrationspring-integration-sftp

How to copy files by SFTP sequentially (Spring integration)?


I have to copy files A and B sequentially to a remote folder. It is important that B is sent only after A has been sent, ot at least at the same time, but not before. I've read the doc, but it's not clear. My idea is to put 2 messages into the same channel. But I don't know if the files linked to these 2 messages will be sent sequentially.

@Component
public class JobExportExecutionsRouter {
  ...
  @Autowired
  private MessageChannel sftpIncrExportChannel;
  ...
  @Router
  public List<String> routeJobExecution(JobExecution jobExecution) {
    final List<String> routeToChannels = new ArrayList<String>();
    ...
    sftpIncrExportChannel.send(MessageBuilder.withPayload(fileA).build());
    sftpIncrExportChannel.send(MessageBuilder.withPayload(fileB).build());
    routeToChannels.add("sftpIncrExportChannel");
    return routeToChannels;
  }
}

My XML configuration contains:

<int:channel id="sftpIncrExportChannel">
  <int:queue/>
</int:channel>
...
<int-sftp:outbound-channel-adapter session-factory="sftpSessionFactory" channel="sftpIncrExportChannel" charset="UTF8" remote-directory="${export.incr.sftp.dir}" />
...
<bean id="sftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
  <property name="host" value="${export.incr.sftp.dir}"/>
  <property name="user" value="${export.incr.sftp.user}"/>
  <property name="password" value="${export.incr.sftp.password}"/>
</bean>

Do you have suggestions?


Solution

  • If you remove the <queue/> from the channel, they will run sequentially on your calling thread.

    If you use a queue channel; you need a poller but, as long as the poller does not have a task-executor, the messages will be sent sequentially on the poller thread. The next poll doesn't happen until the current one completes.