Корпоративная сервисная шина данных (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 и даже дать попробовать шину в тест.