[Из песочницы] Мониторим фриланс площадки в slack
Наша компания занимается разработкой интеграционных решений и регулярно нуждается в поиске предложений в этой области. Таким образом, сформировалась задача: разработать платформу для мониторинга предложений о работе с крупных площадок. Платформа должна отслеживать предложения, содержащие некоторые ключевые слова, и публиковать их в slack канале.
После реализации приложения и локального запуска мы решили опубликовать его для сообщества, предоставить свободный доступ для использования, а также опубликовать исходники. В итоге, мы представляем платформу Job Freelance Scanner.
Возможности
Job Freelance Scanner — платформа для мониторинга предложений с крупных глобальных площадок по поиску работы, разработанная компанией Leadex Systems. Эта платформа позволяет получать предложения единым потоком в канал связи (Slack) от таких площадок как:
- Upwork.com
- Freelancer.com
- Guru.com
Сообщение о новом предложении о работе поступают в кратчайшие сроки после публикации, что позволяет осуществлять мониторинг свежих предложений и откликаться на них одним из первых. Пример сообщения с предложением о работе в канале slack:
Настройка
Для начала использования платформы необходимо:
- пройти по ссылке jobfreelancescanner.com;
- авторизоваться через аккаунт Google или LinkedIn;
- ввести поисковые запросы (ключевые слова), по которым будет осуществляться мониторинг предложений о работе с соответствующего сайта;
- на соседней вкладке изменить настройки slack нотификации;
- готово. В указанный канал slack начинают падать предложения.
Архитектура
Для решения поставленной задачи была разработана следующая архитектура: через определенный промежуток времени ищутся по ключевым словам предложения о работе с нужных площадок с помощью их внутреннего API. Отсеиваются уже опубликованные и рассылаются подписанным клиентам.
Легенда:
Как видно из схемы, проект состоит из нескольких независимых модулей. Для общения между модулями приложения используется 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