Корпоративная сервисная шина данных (ESB)

Enterprise Service Bus (Корпоративная сервисная шина данных)

Собственная разработка базирующаяся на платформе интеграций приложений Apache Camel с дополнительными надстройками, такими как балансировка нагрузки, логирование событий и данных и прочее. Настройку интеграционных маршрутов вынесли в groovy скрипты, что позволяет в динамике писать подгружать и настраивать интеграцию

Видео с примером работы шины

что это такое

Основной принцип ШИНЫ(ESB) — передача информации между различными приложениями путем передачи данных по любому «транспорту». Шина разделяет приложения, организовывая коммуникацию независящую ни от формы данных ни от способа их передачи

Концепция ШИНЫ появилась благодаря желанию избавиться от программирования транспортного слоя интеграции (те подбирать компоненты для считывания почты, работы с SFTP,  поднятие интеграционных сервисов точка-точки) , которая со временем становится разрозненной и как следствие менее управляемой со сложной системой мониторинга и управления

Корпоративная интеграционная шина
Корпоративная интеграционная шина

зачем

для повышения гибкости, для увеличения скорости развертываемости

  • когда задуматься о новом подходе к интеграции

    когда выросли затраты в первую очередь на поддержку интеграции

  • когда количество разных протоколов и методов выросло в разы
  • когда нужно маршрутизировать интеграционные данные, а не просто передавать из А в Б
  • когда требуется гарантированная доставка сообщения вне зависимости от транспорта
  • когда количество форматов данных уже не укладывается в разумные рамки (более двух)
  • когда требуется быстрое масштабирование

как начать настраивать интеграцию

получить в тест шину

начать писать скрипты интеграции

3 строки что бы информировать о любом событии в Telegram
builder.from("direct:telegramSendMessage")
        .id("telegramSendMessage").description("отправка сообщения в телеграмм")
        .toD("https://api.telegram.org/bot\${header.botId}/sendMessage?chat_id=\${header.chatId}&text=\${bodyAs(String)} ")
забрать файлы из почты и трасформировать в XML
//получение сообщения из почты
builder.from("pop3s:mail3.mail.ru:995?username=esb@mail.ru&password=ччччччч&fetchSize=1&delete=true")
        .id("fromMail").description("загружаю из почты cwms pop3 из ящика esb@mail.ru")
// разделили на вложения
        .split(new SplitEmailByParts())
        .log("\${in.header.fileName}")
        .log("\${in.header.fileName} regex '\\*\\.(xlsx|xls|csv)' ")
        .choice()
//если вложенный файл XML
        .when(builder.header("fileName").endsWith(".xml"))
//установили хидеры для сохранениея в бд
//завернули в edi сообщение
        .setHeader(BaseEdiHeaders.PROCESSING_STEP, builder.constant("workWithFileFromMAIL"))
        .setHeader(BaseEdiHeaders.STATUS, builder.constant(EdiBusMessage.Status.PENDING))
        .setHeader(BaseEdiHeaders.BASE_ROUTE_ID, builder.constant("xmlFromQueue"))
        .to("direct:body-wrap") //тут BODY NULL почему????
// сохнанили в базу со статусом  PENDING для дальнейшей обработки
        .to("direct:edi-queue-push")



 

файлы из почты трансформируем в базовый XML
/**
* Забрали сообщение из очереди
* EXCEL
* **/
builder.from("direct:excelFromQueue")
.id("excelFromQueue").description("забираем из очереди EXCEL и трансформируем в XML")
.to("direct:processed")
//развернули из сообщения тело
.to("direct:body-unwrap")
//если это EXCEL то переводим в XML
.to("direct:xls2xml")
//установили хидеры для сохранениея в бд
// меняем заголовки что бы отразить выполнение в базу
.setHeader(BaseEdiHeaders.UP, builder.simple("\${in.header." + BaseEdiHeaders.N + "}"))
.setHeader(BaseEdiHeaders.N, builder.constant(0L))
//завернули в edi сообщение
.setHeader(BaseEdiHeaders.PROCESSING_STEP, builder.constant("after-xls2xml"))
.setHeader(BaseEdiHeaders.STATUS, builder.constant(EdiBusMessage.Status.PENDING))
.setHeader(BaseEdiHeaders.BASE_ROUTE_ID, builder.constant("xml2xslFromQueue"))
.to("direct:body-wrap") //тут BODY NULL почему????
// сохнанили в базу со статусом PENDING для дальнейшей обработки
.to("direct:edi-queue-push")
XML трансформируем с помощью XSLT трансформации в формат который уже универсален для НАС
/**
* забрали из очереди XML
* делаем трансформацию XSL в формат WMS
*
* **/
builder.from("direct:xml2xslFromQueue")
.id("xml2xslFromQueue").description("забираем из очереди XML и трансформируем в XML")
.to("direct:processed")
//развернули из сообщения тело
.to("direct:body-unwrap")
.toD("xslt:file://C:/_ESB/scripts/XSL/fulleksInbound.xsl")
//установили хидеры для сохранениея в бд
// меняем заголовки что бы отразить выполнение в базу
.setHeader(BaseEdiHeaders.UP, builder.simple("\${in.header." + BaseEdiHeaders.N + "}"))
.setHeader(BaseEdiHeaders.N, builder.constant(0L))
//завернули в edi сообщение
.setHeader(BaseEdiHeaders.PROCESSING_STEP, builder.constant("after-xls2xml"))
.setHeader(BaseEdiHeaders.STATUS, builder.constant(EdiBusMessage.Status.PENDING))
.setHeader(BaseEdiHeaders.BASE_ROUTE_ID, builder.constant("xmlFromQueue"))
.to("direct:body-wrap") //тут BODY NULL почему????
// сохнанили в базу со статусом PENDING для дальнейшей обработки
.to("direct:edi-queue-push")
Отправляем XML в WMS для создания документов
/**
* Забрали сообщение из очереди
* XML и отправляем в WMS для создания документов поставки или отгрузки
* **/
builder.from("direct:xmlFromQueue")
.id("xmlFromQueue").description("забираем из очереди XML и отправляем на обработку в direct:kk-load-xml")
.to("direct:processed")
//развернули из сообщения тело
.to("direct:body-unwrap")
// инициализировали dataSource
.to("direct:oracle-CWMS")
//cунули на обработку в пакет БД
.to("direct:kk-load-xml")
// меняем заголовки что бы отразить выполнение в базу
.setHeader(BaseEdiHeaders.UP, builder.simple("\${in.header." + BaseEdiHeaders.N + "}"))
.setHeader(BaseEdiHeaders.N, builder.constant(0L))
// двинули на след обработке PROCESSING_STEP = XSLT
.setHeader(BaseEdiHeaders.PROCESSING_STEP, builder.constant("KK_LOAD_XML"))
.setHeader(BaseEdiHeaders.STATUS, builder.constant(EdiBusMessage.Status.PROCESSED))
.log("KK_LOAD_XML DONE step. ")
.to("direct:body-wrap")
.to("direct:edi-queue-push")

 

Корпоративная интеграционная шина
Корпоративная интеграционная шина

мы готовы ответить на все вопросы по тел. +7(495)775-76-31 и даже дать попробовать шину в тест.