Introduction
We will create Spring integration file adapter example. This example will show you how to transfer file from source directory to destination directory using file adapter in Spring integration or how to move a file from source to destination folder or how to poll a directory at an interval to move file to the destination folder. You may also decide to delete or not after the file has been moved to the destination folder by setting auto delete flag to true.
Prerequisites
Eclipse 4.12, Java 8 or 12, Gradle 5.6, Spring Boot 2.1.8
Creating Project
Create a gradle based project in Eclipse with the project’s name as spring-integration-file-transfer.
Updating Build Script
The default generated build.gradle script has to be updated to include the required dependencies.
We have two dependencies for Spring integration and file adapter in the below build script.
buildscript {
ext {
springBootVersion = '2.1.8.RELEASE'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
sourceCompatibility = 12
targetCompatibility = 12
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-integration:${springBootVersion}")
implementation("org.springframework.integration:spring-integration-file:5.1.7.RELEASE")
}
Creating Application Properties
We will create an application.properties file under src/main/resources which will content key/value pair properties.
For example, we will put input directory name from where file will be moved to another directory.
We will also put destination directory where the file will be moved.
file.input.directory=C:/file-input
file.output.directory=C:/file-output
Creating Config Class
We will create a config class that contains several configurations for the applications, such as, creation of Spring beans, reading properties file etc.
package com.jeejava.spring.integration.file.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.integration.config.EnableIntegration;
@Configuration
@EnableIntegration
public class FileConfig {
@Autowired
private Environment env;
// ...
}
Creating Main Class
Main class with @SpringBootApplication
is enough to deploy the application into embedded Tomcat server.
We will run the application using CommandLineRunner
.
package com.jeejava.spring.integration.file;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringIntegrationFileApp implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringIntegrationFileApp.class, args);
}
@Override
public void run(String... args) throws Exception {
}
}
Example – Moving File
We will create a simple example where we will transfer a file from a particular directory into a destination directory.
Creating FileReadingMessageSource Bean
We need to create a FileReadingMessageSource
bean in order to read the file from a source directory. We will mark this bean as an input channel adapter.
We have to configure poller to poll the directory at a certain interval to check whether a new file is there or not. Another reason is you will get exception if you do not configure poller when you are using FileReadingMessageSource
as inbound channel adapter.
java.lang.IllegalArgumentException: No poller has been defined for Annotation-based endpoint, and no default poller is available within the context.
We will configure the source directory into this bean to read the file from the source directory.
Related Posts:
We will create service activator that will sit between input channel adapter and output channel adapter. We will configure output channel adapter for destination directory.
Put the below code snippets into the FileConfig
class.
@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
public FileReadingMessageSource fileReadingMessageSource() {
FileReadingMessageSource fileReadingMessageSource = new FileReadingMessageSource();
fileReadingMessageSource.setDirectory(new File(env.getProperty("file.input.directory")));
return fileReadingMessageSource;
}
@Bean
@ServiceActivator(inputChannel = "fileInputChannel")
public FileWritingMessageHandler fileWritingMessageHandler() {
FileWritingMessageHandler fileWritingMessageHandler = new FileWritingMessageHandler(
new File(env.getProperty("file.output.directory")));
fileWritingMessageHandler.setAutoCreateDirectory(true);
fileWritingMessageHandler.setExpectReply(false);
//fileWritingMessageHandler.setDeleteSourceFiles(true);
return fileWritingMessageHandler;
}
In the above code snippets we have created FileWritingMessageHandler
to move the file from source to destination directory.
We have configured destination directory, auto creation of directory if directory does not exist.
You may also configure whether you want to delete the file from the source directory once moved to the destination directory.
You need to setExpectRelay()
to false
because FileWritingMessageHandler
uses by default request/reply mechanism. If you do not set it to false then you will see below exception:
org.springframework.messaging.MessageHandlingException: error occurred in message handler [fileWritingMessageHandler]; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
Testing the Application
Run the main class and you will see the file has been moved to the destination directory:

That’s all. Hope you got an idea on moving a file from source to destination directory using Spring integration.
Source Code
Thanks for reading.