1. Введение
Поддержка файлов — это еще одна конечная точка Spring Integration для связи с внешними системами. В этом случае он предоставляет несколько компонентов для чтения, записи и преобразования файлов. В этом посте мы собираемся написать приложение, которое отслеживает каталог, чтобы прочитать все файлы в нем. В бетоне это делает следующее:
- Когда приложение запускается, оно читает все файлы, присутствующие в каталоге.
- Затем приложение будет следить за каталогом, чтобы обнаружить новые файлы и существующие файлы, которые были изменены.
Исходный код можно найти в Github .
2 Конфигурация
Приложение построено с использованием Spring Boot, поскольку оно значительно облегчает настройку. Чтобы создать начальную инфраструктуру приложения, вы можете перейти по адресу https://start.spring.io/ , выбрать модуль интеграции и сгенерировать проект. Затем вы можете открыть ZIP-файл в вашей любимой IDE.
Я добавил пару зависимостей в pom.xml, например commons.io или Spring Integration Java DSL. Мой файл pom.xml выглядит следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <modelVersion>4.0.0</modelVersion> <groupId>xpadro.spring.integration</groupId> <artifactId>file-read-directory</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>file-read-directory</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Spring Integration - Java DSL --> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-java-dsl</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> |
Отправной точкой является FileReadDirectoryApplication:
|
1
2
3
4
5
6
7
|
@SpringBootApplicationpublic class FileReadDirectoryApplication { public static void main(String[] args) throws IOException, InterruptedException { SpringApplication.run(FileReadDirectoryApplication.class, args); }} |
Начиная с этого момента, мы собираемся добавить компоненты Spring Integration для чтения из определенной папки файловой системы.
3 Добавление адаптера
Для чтения из файловой системы нам нужен адаптер входящего канала. Адаптер является источником сообщений для чтения файлов, который отвечает за опрос файловой системы в каталоге и создает сообщение из каждого найденного файла.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Bean@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))public MessageSource<File> fileReadingMessageSource() { CompositeFileListFilter<File> filters = new CompositeFileListFilter<>(); filters.addFilter(new SimplePatternFileListFilter("*.txt")); filters.addFilter(new LastModifiedFileFilter()); FileReadingMessageSource source = new FileReadingMessageSource(); source.setAutoCreateDirectory(true); source.setDirectory(new File(DIRECTORY)); source.setFilter(filters); return source;} |
Мы можем предотвратить опрос некоторых типов файлов, установив список фильтров для источника сообщений. Для этого примера были включены два фильтра:
- SimplePatternFileListFilter : Фильтр предоставлен Spring. Только файлы с указанным расширением будут опрошены. В этом случае принимаются только текстовые файлы.
- LastModifiedFileFilter : пользовательский фильтр. Этот фильтр отслеживает уже опрошенные файлы и отфильтровывает файлы, не измененные с момента последнего отслеживания.
4 Обработка файлов
Для каждого опрашиваемого файла мы преобразуем его содержимое в строку, прежде чем передать его процессору. Для этого Spring уже предоставляет компонент:
|
1
2
3
4
|
@Beanpublic FileToStringTransformer fileToStringTransformer() { return new FileToStringTransformer();} |
Следовательно, вместо получения сообщения <File>, процессор получит сообщение <String>. Файловый процессор — это наш пользовательский компонент, который будет выполнять такие же сложные функции, как печать содержимого файла:
|
01
02
03
04
05
06
07
08
09
10
11
|
public class FileProcessor { private static final String HEADER_FILE_NAME = "file_name"; private static final String MSG = "%s received. Content: %s"; public void process(Message<String> msg) { String fileName = (String) msg.getHeaders().get(HEADER_FILE_NAME); String content = msg.getPayload(); System.out.println(String.format(MSG, fileName, content)); }} |
5 Построение потока
Теперь, когда у нас есть все необходимые компоненты, давайте создадим поток. Мы используем Spring Integration Java DSL, поскольку он делает поток более читабельным:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
@Beanpublic IntegrationFlow processFileFlow() { return IntegrationFlows .from("fileInputChannel") .transform(fileToStringTransformer()) .handle("fileProcessor", "process").get(); } @Bean public MessageChannel fileInputChannel() { return new DirectChannel(); } |
6 Запуск приложения
В моем каталоге у меня уже есть файл с именем «previousFile.txt». После запуска приложения мы создадим два файла и изменим один из них.
|
01
02
03
04
05
06
07
08
09
10
|
public static void main(String[] args) throws IOException, InterruptedException { SpringApplication.run(FileReadDirectoryApplication.class, args); createFiles();}private static void createFiles() throws IOException, InterruptedException { createFile("file1.txt", "content"); createFile("file2.txt", "another file"); appendFile("file1.txt", " modified");} |
Если мы запустим приложение, мы должны увидеть следующие операторы печати:
|
1
2
3
4
|
previousFile.txt received. Content: previous contentfile1.txt received. Content: contentfile2.txt received. Content: another filefile1.txt received. Content: content modified |
7 Заключение
В этом примере показано, как просто читать файлы из каталога с помощью Spring Integration, очевидно, с помощью Spring Boot, чтобы упростить настройку. В зависимости от ваших потребностей, вы можете добавить свои собственные пользовательские фильтры к источнику сообщений или использовать другой из предоставляемых Spring, например RegexPatternFileListFilter . Вы можете проверить другие реализации здесь .
Если вы нашли этот пост полезным, поделитесь им или пометьте мой репозиторий 🙂
Я публикую свои новые сообщения в Google Plus и Twitter. Следуйте за мной, если вы хотите быть в курсе нового контента.
| Ссылка: | Spring Integration — Создание и изменение файла опроса от нашего партнера по |