Перейти к основному содержимому
Руководство администратора
How To статьи
Установка и настройка
Компоненты
Руководство пользователя
Начало работы

Обработка 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

Шаги выполнения

Поток последовательно выполняет шаги:

  1. Приём HTTP-запроса (from) - Ожидание POST-запроса с ZIP-архивом
  2. Распаковка ZIP (unmarshal) - Преобразование ZIP → итератор файлов.
  3. Разделение (split) - Разбиение итератора на отдельные элементы
    1. Конвертация (convertBodyTo) - Преобразование бинарных данных в строку
    2. Логирование (log) - Вывод содержимого в логи
  4. После обработки всех файлов маршрут завершается, клиенту возвращается HTTP-ответ 200 OK

Особенности

  1. Потоковая обработка - архив не загружается в память целиком
  • Файлы читаются по одному
  • После обработки файл удаляется из памяти
  1. Изоляция ошибок - ошибки в обработке не останавливают маршрут
  • Если файл повреждён — логируется ошибка, но обработка продолжается
  • Если один файл не конвертируется в строку — остальные обрабатываются
  • Клиент всегда получает 200 OK (даже при частичных ошибках)
  1. Минималистичные настройки HTTP - почти все расширенные функции отключены
  • Упрощение конфигурации
  • Только базовая обработка HTTP
  • Минимальное потребление ресурсов
  1. Версионирование - полная идентификация версии маршрута
  • Обновление без остановки (blue-green)
  • Откат к предыдущей версии
  • Аудит изменений
  • Трассировка запросов к конкретной версии
  1. Гибкость логирования - вывод содержимого каждого файла
  • Срабатывает для каждого файла в архиве
  • Используется подстановка ${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}\""

Шаги выполнения

Поток последовательно выполняет шаги:

  1. Приём HTTP-запроса (from) - Ожидание запроса с данными для архивации
  2. Упаковка в ZIP (marshal) - Преобразование тела запроса в ZIP-архив
  3. Установка Content-Type (setHeader) - Добавление HTTP-заголовка с типом содержимого
  4. Установка Content-Disposition (setHeader) - Добавление заголовка для скачивания файла
  5. Сформированный ZIP-архив с заголовками отправляется клиенту, клиент получает файл для скачивания

Особенности

  1. Критичность параметра usingIterator- он должен быть всегда указан.

  2. Динамическое имя файла

  • Имя файла подставляется из заголовка запроса
  • Клиент может задать имя через заголовок CamelFileName
  1. Заголовки для скачивания

Комбинация заголовков в примере:

ЗаголовокЗначениеФункция
Content-Typeapplication/zipСообщает тип файла
Content-Dispositionattachment; filename=...Запускает диалог сохранения

Браузер:

  1. Понимает, что это ZIP-файл
  2. Предлагает сохранить его на диск
  3. Использует указанное имя файла
  4. Минимализм обработки - маршрут делает ровно одну полезную операцию — упаковывает данные в 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}" # в указанной папке будут созданы архивы с именами файлов

Шаги выполнения

Поток последовательно выполняет шаги:

  1. Чтение файлов из папки (from) - мониторинг и чтение файлов из указанной директории
    Важно: noop: true означает, что после обработки файлы остаются в папке-источнике (не удаляются и не перемещаются).
  2. Упаковка в ZIP (marshal) - преобразование каждого файла в ZIP-архив
  3. Сохранение результата (to) - запись ZIP-архивов в целевую папку
  4. Завершение:
  • После сохранения всех файлов маршрут завершается
  • Файлы в папке-источнике остаются (noop: true)
  • В папке-архивах появляются ZIP-файлы

Особенности

  1. Массовая обработка файлов
  • При старте маршрута сканируется вся папка
  • Для каждого файла создаётся отдельный маршрут
  1. Отсутствие HTTP (работа с файловой системой)
  • Не требует внешних вызовов
  • Запускается автоматически при старте движка
  • Обрабатывает все файлы в папке
  1. : Потоковый режим упаковки
  • usingIterator: true — потоковый режим, минимальное потребление памяти
  • Каждый файл упаковывается отдельно
  • Подходит для больших файлов
  1. Автоматическое создание папки
  • При первом сохранении автоматически создаётся папка /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

Шаги выполнения

Поток последовательно выполняет шаги:

  1. Чтение текстовых файлов из папки (from) - Мониторинг и чтение файлов с расширением .txt
  2. Агрегация файлов в единый архив (aggregate) - Объединение всех текстовых файлов в один ZIP-архив
  3. Установка имени архива (setHeader) - Задание имени для результирующего файла
  4. Сохранение результата (to) - Запись ZIP-архива в целевую папку
  5. Логирование (log) - Вывод сообщения об успешном создании архива
  6. Регистрация бина (beans) - Определение компонента для агрегации

Особенности

  1. Агрегация всех файлов в один архив
Исходная папка (source-files)
├── file1.txt ────┐
├── file2.txt ────┤
├── file3.txt ────┤──→ Агрегация → batch-archive.zip
└── file4.txt ────┘
  1. Использование встроенной стратегии агрегации
  • При получении первого файла — создаётся новый ZIP-архив
  • При получении следующих файлов — добавляются в существующий архив
  • При завершении — архив финализируется и сохраняется
  1. Ожидание всех файлов
ПараметрФункция
completionFromBatchConsumer: trueЖдать, пока все файлы будут прочитаны из папки
eagerCheckCompletion: trueПроверять после каждого файла — все ли собраны

Важно: Без completionFromBatchConsumer маршрут может завершиться после первого файла!

  1. Фильтрация по расширению
  • Читает только файлы с расширением, заданным antInclude
  • Файлы с другими расширениями игнорируются
  1. Использование фиксированного имя архива