Обработка ZIP архивов
Bercut ESB поддерживает обработку ZIP архивов. Ниже приведены примеры потоков, реализующих распаковку и создание ZIP архивов.
Пример потока для потоковой распаковки и обработки содержимого ZIP архива
Тип маршрута: Потоковый обработчик ZIP-архивов
Назначение: Принять архив → распаковать → для каждого файла вывести содержимое в логи
configurationItems:
- resourceGroupId: 1
meta:
routeId: "46"
routeVersion: 1
routeVersionId: 64d50410-01a3-466f-914b-8e7875f18155
domainId: 1
url: /routes/zip-test
route: |
- route:
id: "46"
from:
id: "46"
uri: platform-http
parameters:
path: /routes/zip-test
cookiePath: /
cookieSecure: false
useStreaming: false
muteException: true
cookieHttpOnly: false
cookieSameSite: Lax
matchOnUriPrefix: false
useCookieHandler: false
bridgeErrorHandler: false
handleWriteResponseError: false
returnHttpRequestHeaders: false
steps:
# Потоковая распаковка архива с использованием итератора
- unmarshal:
zipFile:
usingIterator: true # Режим потоковой обработки больших архивов
# Разделение на отдельные файлы для обработки
- split:
expression:
simple: "${bodyAs(java.util.Iterator)}"
streaming: true # Потоковая обработка без буферизации в памяти
steps:
- convertBodyTo:
type: String
- log:
message: "Содержимое файла: ${body}"
loggingLevel: INFO
Шаги выполнения
Поток последовательно выполняет шаги:
- Приём HTTP-запроса (
from) - Ожидание POST-запроса с ZIP-архивом - Распаковка ZIP (
unmarshal) - Преобразование ZIP → итератор файлов. - Разделение (
split) - Разбиение итератора на отдельные элементы- Конвертация (
convertBodyTo) - Преобразование бинарных данных в строку - Логирование (
log) - Вывод содержимого в логи
- Конвертация (
- После обработки всех файлов маршрут завершается, клиенту возвращается HTTP-ответ 200 OK
Особенности
- Потоковая обработка - архив не загружается в память целиком
- Файлы читаются по одному
- После обработки файл удаляется из памяти
- Изоляция ошибок - ошибки в обработке не останавливают маршрут
- Если файл повреждён — логируется ошибка, но обработка продолжается
- Если один файл не конвертируется в строку — остальные обрабатываются
- Клиент всегда получает 200 OK (даже при частичных ошибках)
- Минималистичные настройки HTTP - почти все расширенные функции отключены
- Упрощение конфигурации
- Только базовая обработка HTTP
- Минимальное потребление ресурсов
- Версионирование - полная идентификация версии маршрута
- Обновление без остановки (blue-green)
- Откат к предыдущей версии
- Аудит изменений
- Трассировка запросов к конкретной версии
- Гибкость логирования - вывод содержимого каждого файла
- Срабатывает для каждого файла в архиве
- Используется подстановка
${body} - Уровень INFO — видно в стандартных логах
Пример потока для создания ZIP архива из полученных данных
Тип маршрута: Создатель ZIP-архивов
Назначение: Принять данные → упаковать в ZIP → отдать клиенту как файл для скачивания
Примечание:
Допустима отправка только одного файла за раз. При попытке загрузить несколько файлов возникает ошибка.
configurationItems:
- resourceGroupId: 1
meta:
routeId: "47"
routeVersion: 1
routeVersionId: 74d50410-01a3-466f-914b-8e7875f18156
domainId: 1
url: /routes/create-zip
route: |
- route:
id: "47"
from:
id: "47"
uri: platform-http
parameters:
path: /routes/create-zip
cookiePath: /
cookieSecure: false
useStreaming: false
muteException: true
cookieHttpOnly: false
cookieSameSite: Lax
matchOnUriPrefix: false
useCookieHandler: false
bridgeErrorHandler: false
handleWriteResponseError: false
returnHttpRequestHeaders: false
steps:
# Упаковка тела запроса в ZIP архив
- marshal:
zipFile:
usingIterator: false # в документации указан как опциональный, но в действительности без параметра поток не запускается
# Установка MIME-типа ответа как ZIP архив
- setHeader:
name: Content-Type
simple: "application/zip"
# Заголовок для скачивания файла с оригинальным именем
- setHeader:
name: Content-Disposition
simple: "attachment; filename=\"${header.CamelFileName}\""
Шаги выполнения
Поток последовательно выполняет шаги:
- Приём HTTP-запроса (
from) - Ожидание запроса с данными для архивации - Упаковка в ZIP (
marshal) - Преобразование тела запроса в ZIP-архив - Установка Content-Type (
setHeader) - Добавление HTTP-заголовка с типом содержимого - Установка Content-Disposition (
setHeader) - Добавление заголовка для скачивания файла - Сформированный ZIP-архив с заголовками отправляется клиенту, клиент получает файл для скачивания
Особенности
-
Критичность параметра
usingIterator- он должен быть всегда указан. -
Динамическое имя файла
- Имя файла подставляется из заголовка запроса
- Клиент может задать имя через заголовок
CamelFileName
- Заголовки для скачивания
Комбинация заголовков в примере:
| Заголовок | Значение | Функция |
|---|---|---|
Content-Type | application/zip | Сообщает тип файла |
Content-Disposition | attachment; filename=... | Запускает диалог сохранения |
Браузер:
- Понимает, что это ZIP-файл
- Предлагает сохранить его на диск
- Использует указанное имя файла
- Минимализм обработки - маршрут делает ровно одну полезную операцию — упаковывает данные в ZIP
Пример потока для создания ZIP N-архивов из указанной папки на диске
Тип маршрута: Пакетный архиватор файлов
Назначение: Прочитать все файлы из папки → каждый упаковать в ZIP → сохранить в другую папку
configurationItems:
- resourceGroupId: 1
meta:
routeId: "47"
routeVersion: 1
routeVersionId: 74d50410-01a3-466f-914b-8e7875f18156
domainId: 1
url: /routes/create-zip
route: |
- route:
id: "47"
from:
uri: "file:///Users/macbook/source-files" # используем компонент File
parameters:
antInclude: "*" # все файлы в указанной папке
noop: true # не удалять файлы после обработки
steps:
- marshal:
zipFile:
usingIterator: true
- to:
uri: "file:///Users/macbook/zip-archives"
parameters:
autoCreate: true
fileName: "${header.CamelFileName}" # в указанной папке будут созданы архивы с именами файлов
Шаги выполнения
Поток последовательно выполняет шаги:
- Чтение файлов из папки (
from) - мониторинг и чтение файлов из указанной директории
Важно:noop: trueозначает, что после обработки файлы остаются в папке-источнике (не удаляются и не перемещаются). - Упаковка в ZIP (
marshal) - преобразование каждого файла в ZIP-архив - Сохранение результата (
to) - запись ZIP-архивов в целевую папку - Завершение:
- После сохранения всех файлов маршрут завершается
- Файлы в папке-источнике остаются (
noop: true) - В папке-архивах появляются ZIP-файлы
Особенности
- Массовая обработка файлов
- При старте маршрута сканируется вся папка
- Для каждого файла создаётся отдельный маршрут
- Отсутствие HTTP (работа с файловой системой)
- Не требует внешних вызовов
- Запускается автоматически при старте движка
- Обрабатывает все файлы в папке
- : Потоковый режим упаковки
usingIterator: true— потоковый режим, минимальное потребление памяти- Каждый файл упаковывается отдельно
- Подходит для больших файлов
- Автоматическое создание папки
- При первом сохранении автоматически создаётся папка
/Users/macbook/zip-archives - Не нужно создавать папку вручную
- Упрощает развёртывание
Пример потока для создания одного ZIP архива из указанной папки на диске
Тип маршрута: Пакетный архиватор с агрегацией
Назначение: Собрать все текстовые файлы из папки → объединить в один ZIP-архив → сохранить
configurationItems:
- resourceGroupId: 1
meta:
routeId: "48"
routeVersion: 1
routeVersionId: 95d50410-01a3-466f-914b-8e7875f18159
domainId: 1
url: /file-zip-processor
route: |
- route:
id: "48"
from:
id: "48"
uri: "file:///Users/macbook/source-files"
parameters:
noop: true # не удалять файлы после обработки
antInclude: "*.txt" # текстовые файлы в указанной папке
steps:
# Запуск агрегации для объединения файлов
- aggregate:
# Определение условия группировки сообщений
correlationExpression:
constant: true # все файлы принадлежат к одной группе
aggregationStrategy: "zipAggregationStrategy" # Стратегия агрегации - использование бина ZipAggregationStrategy
completionFromBatchConsumer: true # Ожидание завершения обработки всех файлов от File consumer
eagerCheckCompletion: true # Немедленная проверка завершения при получении каждого сообщения
- setHeader:
name: CamelFileName
simple: "batch-archive.zip"
- to: "file:///Users/macbook/zip-archives"
- log:
message: "ZIP архив создан"
loggingLevel: INFO
- beans:
- name: zipAggregationStrategy
type: org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy
Шаги выполнения
Поток последовательно выполняет шаги:
- Чтение текстовых файлов из папки (
from) - Мониторинг и чтение файлов с расширением.txt - Агрегация файлов в единый архив (
aggregate) - Объединение всех текстовых файлов в один ZIP-архив - Установка имени архива (
setHeader) - Задание имени для результирующего файла - Сохранение результата (
to) - Запись ZIP-архива в целевую папку - Логирование (
log) - Вывод сообщения об успешном создании архива - Регистрация бина (
beans) - Определение компонента для агрегации
Особенности
- Агрегация всех файлов в один архив
Исходная папка (source-files)
├── file1.txt ────┐
├── file2.txt ────┤
├── file3.txt ────┤──→ Агрегация → batch-archive.zip
└── file4.txt ────┘
- Использование встроенной стратегии агрегации
- При получении первого файла — создаётся новый ZIP-архив
- При получении следующих файлов — добавляются в существующий архив
- При завершении — архив финализируется и сохраняется
- Ожидание всех файлов
| Параметр | Функция |
|---|---|
completionFromBatchConsumer: true | Ждать, пока все файлы будут прочитаны из папки |
eagerCheckCompletion: true | Проверять после каждого файла — все ли собраны |
Важно: Без completionFromBatchConsumer маршрут может завершиться после первого файла!
- Фильтрация по расширению
- Читает только файлы с расширением, заданным
antInclude - Файлы с другими расширениями игнорируются
- Использование фиксированного имя архива