Мониторим фриланс площадки в slack

в 9:04, , рубрики: Apache ActiveMQ, apache camel, freelance, java, slack, Программирование

В этой статье мы бы хотели рассказать о нашей новой платформе Job Freelance Scanner, которая находится в свободном доступе. В поисках нового проекта порой приходится мониторить фриланс площадки на наличие подходящего предложения. Это порождает ряд проблем: поиск по разным сайтам, вбивание в поиске нужных ключевых слов, отсеивание дубликатов — все это отнимает время. Плюс, надо помнить читал ли ты это предложение. Вот было бы удобно мониторить это одним инструментом, при этом в онлайн режиме.

Наша компания занимается разработкой интеграционных решений и регулярно нуждается в поиске предложений в этой области. Таким образом, сформировалась задача: разработать платформу для мониторинга предложений о работе с крупных площадок. Платформа должна отслеживать предложения, содержащие некоторые ключевые слова, и публиковать их в slack канале.

После реализации приложения и локального запуска мы решили опубликовать его для сообщества, предоставить свободный доступ для использования, а также опубликовать исходники. В итоге, мы представляем платформу Job Freelance Scanner.

Возможности

Job Freelance Scanner — платформа для мониторинга предложений с крупных глобальных площадок по поиску работы, разработанная компанией Leadex Systems. Эта платформа позволяет получать предложения единым потоком в канал связи (Slack) от таких площадок как:

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

Мониторим фриланс площадки в slack - 1

Настройка

Для начала использования платформы необходимо:

  • пройти по ссылке jobfreelancescanner.com;
  • авторизоваться через аккаунт Google или LinkedIn;
  • ввести поисковые запросы (ключевые слова), по которым будет осуществляться мониторинг предложений о работе с соответствующего сайта;
  • на соседней вкладке изменить настройки slack нотификации;
  • готово. В указанный канал slack начинают падать предложения.

Архитектура

Для решения поставленной задачи была разработана следующая архитектура: через определенный промежуток времени ищутся по ключевым словам предложения о работе с нужных площадок с помощью их внутреннего API. Отсеиваются уже опубликованные и рассылаются подписанным клиентам.

Мониторим фриланс площадки в slack - 2

Легенда:

Мониторим фриланс площадки в slack - 3

Как видно из схемы, проект состоит из нескольких независимых модулей. Для общения между модулями приложения используется Apache ActiveMQ в качестве брокера сообщений и MongoDB для хранения настроек клиентов. Для интеграции модулей нашего решения используется Apache Camel.

Пример интеграции Slack и ActiveMQ с помощью Apache Camel

Рассмотрим подробней модуль, который конвертирует предложения о работе в сообщение для Slack и отправляет их с помощью интеграции slack компонента от Apache Camel. В основе этого компонента лежит роут описанный на Java DSL.

from("activemq:queue://" + activemqQueue +
       "?username=" + activemqUser +
       "&password=" + activemqPass +
       "&disableReplyTo=true")
       .process(jsonToPojoProcessor)
       .process(aggregateJobProcessor)
       .split(body())
       .process(jobToSlackMessageProcessor)
       .to("direct:slackOutput");

from("direct:slackOutput")
       .recipientList(simple("slack:#${header.uri}"));

Роут — это описание маршрута передачи сообщений. Характеристиками такого роута являются начальная точка, обозначенная токеном from (в нашем случае это компонент для ActiveMQ) и конечная точка, обозначенная токеном to (компонент для Slack). Apache Camel предоставляет различные компоненты для интеграции (смотри полный список тут camel.apache.org/components).

Настройка компонента activemq задается с помощью URI строки. В нашем случае эта строка составляется при помощи вставки параметров, заданных через файл настроек. Рассмотрим пример полученной URI строки.

from("activemq:queue://slackNotify?username=admin&password=admin")

Это описание входной точки с помощью сгенерированной строки URI. Где activemq — название компонента, а queue — тип канала сообщений, который может быть или очередью (queue), или темой (topic). Далее идёт название канала — slackNotify. Последняя часть URI — параметры конечной точки: username/password — логин и пароль пользователя.

Затем идут несколько конвертеров и сплиттер:

  • jsonToPojoProcessor — преобразование входного сообщения JSON формата во внутреннюю модель данных Notification (модель содержит список предложений о работе и настройки для slack). Для конвертации используется библиотека Google Gson, позволяющая конвертировать JSON в Java объект и наоборот.
  • aggregateJobProcessor — конвертирование из модели данных Notification в массив предложений о работе. Также записываются настройки канала slack в заголовок.
  • split(body()) — разделяет входной массив предложений о работе в самостоятельные потоки.
  • jobToSlackMessageProcessor — конвертирует предложение о работе в сообщение для slack канала.

Для интеграции со Slack также используется компонент от Apache Camel. Но возникает проблема: настройки слэк канала нам заранее неизвестны. Узнать их мы можем только из входящего сообщения. Конвертер aggregateJobProcessor формирует часть URI строки с настройками канала и записывает ее в заголовок для того, чтобы затем можно было создать динамический маршрут (Dynamic Router)

from("direct:slackOutput")
       .recipientList(simple("slack:#${header.uri}"));

Особенность этого маршрута заключается в том, что в нем динамически выбирается конечная точка, а конкретно компонент slack с настройками канала в который будут отправляться сообщения. Для построения маршрута используются данные из самого сообщения (его заголовка), которые достаются с помощью SEL (Simple Expression Language) и выполняются с помощью функции simple(). Шаблон EIP — The Recipient List (Список получателей) позволяет создавать динамические конечные точки.

Заключение

Пример интеграции продемонстрировал простоту и удобство использования Apache Camel. Мы надеемся, что платформа Job Freelance Scanner будет для кого-то полезной. Также в будущем мы планируем развивать нашу платформу, например добавить Email нотификацию и улучшить UI.

Ссылки:

→ Ссылка для использования: jobfreelancescanner.com/
→ Ссылка на github: github.com/leadex/job-monitor

Автор: leadexsystems

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js