Статьи

Использование Message Cowboy

Во второй статье о Message Cowboy, инструменте для выполнения запланированных перемещений файлов и передачи сообщений, я расскажу немного о том, как использовать программу.

Свойства конфигурации

Используя свойства конфигурации, мы можем настроить, какая база данных будет использоваться, запускать ли встроенный брокер ActiveMQ и некоторые дополнительные аспекты хранения базы данных и встроенный JMS-брокер.
Файл «message-cowboy-configuration.properties» содержит следующие свойства:

Имя свойства

Описание

DATASOURCE_DRIVER_CLASS_NAME Имя класса драйвера JDBC.
Обратите внимание, что библиотека, содержащая драйвер JDBC, должна быть добавлена ​​как зависимость, и программа должна быть пересобрана, если ее еще нет.
DATASOURCE_URL URL, используемый для подключения к базе данных.
Если используется встроенная база данных, порт в URL-адресе должен соответствовать указанному в свойстве DATABASE_PORT, а имя базы данных в URL-адресе должно совпадать с указанным в свойстве DATABASE_DBNAME.
DATASOURCE_USER_NAME Пользователь базы данных, используемый для подключения к базе данных.
DATASOURCE_PASSWORD Пароль базы данных, используемый для подключения к базе данных.
DATABASE_USE_EMBEDDED_FLAG Флаг, указывающий, использовать ли встроенный сервер базы данных HSQLDB. Возможные значения: true, false
DATABASE_DIRECTORY_PATH Каталог, в котором встроенная база данных HSQLDB будет хранить данные.
Уместно только если используется встроенная база данных HSQLDB.
DATABASE_FILENAME Имя файла, используемого для встроенных файлов базы данных HSQLDB.
Уместно только если используется встроенная база данных HSQLDB.
DATABASE_DBNAME Имя базы данных для встроенной базы данных HSQLDB. Должен соответствовать имени базы данных, указанному в свойстве DATASOURCE_URL.
Уместно только если используется встроенная база данных HSQLDB.
DATABASE_PORT Порт для подключения к встроенной базе данных.
Уместно только если используется встроенная база данных HSQLDB.
ACTIVEMQ_USE_EMBEDDED_FLAG Флаг, указывающий, использовать ли встроенный JMS-брокер ActiveMQ. Возможные значения: true, false
ACTIVEMQ_URI URI для подключения к встроенному JMS-брокеру ActiveMQ.
ACTIVEMQ_JMX_ENABLED_FLAG Предоставьте компоненты JMX для встроенного JMS-брокера ActiveMQ. Возможные значения: true, false Актуально,
только если включен встроенный JMS-брокер ActiveMQ.
ACTIVEMQ_PERSISTENCE_ENABLED_FLAG Флаг включения постоянства для встроенного JMS-брокера ActiveMQ. Возможные значения: true, false Актуально,
только если включен встроенный JMS-брокер ActiveMQ.

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

Запуск сообщения Ковбой

Запуск приложения

Message Cowboy может быть запущен как обычное автономное Java-приложение:

java -jar message-cowboy-1.0.0-SNAPSHOT.jar

В качестве альтернативы вы можете запустить его в Eclipse, щелкнув правой кнопкой мыши класс MessageCowboy и выбрав Run As → Java Application.
В этом разделе я буду использовать второй подход. Кроме того, я предполагаю, что используется конфигурация по умолчанию; использование встроенной базы данных HSQLDB и встроенного JMS-брокера ActiveMQ.

  • В src / main / java найдите класс MessageCowboy , щелкните его правой кнопкой мыши и выберите «Запуск от имени» → «Приложение Java».
    В консоли будет выводиться, последние несколько строк должны быть похожи на эти строки:

    2014-07-28 18:54:48,322 INFO  se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Message Cowboy started
    2014-07-28 18:54:48,329 INFO  org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup 

Обратите внимание на последнее сообщение: «Нажмите [ENTER] в консоли, чтобы остановить Message Cowboy» — это предпочтительный способ выполнить полное отключение Message Cowboy.

Далее мы рассмотрим, как выглядит обновление конфигурации службы транспорта и обновление запланированных задач в журнале. Эти два типа обновлений происходят через регулярные промежутки времени, а не только во время запуска.

Обновление конфигурации транспортного сервиса

Если мы некоторое время наблюдаем за консолью, через некоторое время произойдет следующее:

2014-07-28 19:01:30,002 INFO  se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Started executing task MessageCowboyTransportServiceRefreshTask in group MessageCowboySystemTasks
2014-07-28 19:01:30,002 DEBUG se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Invoking the method refreshConnectors on object of the type se.ivankrizsan.messagecowboy.services.transport.MuleTransportService with the parameters []
2014-07-28 19:01:30,003 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 2 connector configuration files using the pattern file:production-configurations/connectors/*.xml
2014-07-28 19:01:30,004 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 0 connector configuration files using the pattern file:production-configurations/transport-service-configurations/*.xml
2014-07-28 19:01:30,004 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - No changes in configuration resources, skips refresh
2014-07-28 19:01:30,004 INFO  se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Successfully completed executing task MessageCowboyTransportServiceRefreshTask in group MessageCowboySystemTasks

Это обновление конфигурации транспортного сервиса, о котором я упоминал ранее. Мы видим, что транспортная служба обнаружила два файла конфигурации соединителя, никаких изменений обнаружено не было, и обновление было пропущено.

Обновление запланированной задачи

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

2014-07-28 19:09:19,999 INFO  se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Started executing task MessageCowboyReschedulingTask in group MessageCowboySystemTasks
2014-07-28 19:09:19,999 DEBUG se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Invoking the method scheduleTasks on object of the type se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl with the parameters []
2014-07-28 19:09:20,000 INFO  se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Starting to (re)schedule Message Cowboy tasks
2014-07-28 19:09:20,000 INFO  se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Existing tasks unscheduled
[EL Fine]: sql: 2014-07-28 19:09:20.105--ServerSession(261255839)--Connection(623423818)--SELECT NAME, CRONEXPRESSION, ENDDATE, INBOUNDENDPOINTURI, INBOUNDTIMEOUT, OUTBOUNDENDPOINTURI, STARTDATE, TASKENABLEDFLAG, TASKGROUPNAME FROM SchedulableTaskConfigurations
2014-07-28 19:09:20,107 DEBUG se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Found 0 number of tasks
2014-07-28 19:09:20,107 INFO  se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Successfully (re)scheduled Message Cowboy tasks
2014-07-28 19:09:20,107 INFO  se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Successfully completed executing task MessageCowboyReschedulingTask in group MessageCowboySystemTasks

Это периодическое обновление стартовой службы запланированных задач передачи сообщений. Поскольку таблица, содержащая эти задачи, пуста, никакие задачи не будут (повторно) запланированы.

Дела по расписанию

В основе сообщения Ковбой лежит запланированное задание. Задача, которая в определенное время опрашивает входящую конечную точку и распространяет любое сообщение, полученное для исходящей конечной точки.
Входящие конечные точки могут быть файловыми каталогами, очередями JMS, URL-адресами HTTP и т. Д. — любой вид конечной точки, из которой Mule может получить сообщение, используя метод MuleClient.request .
Аналогичным образом исходящие конечные точки могут быть конечными точками любого типа, на которые может быть отправлено сообщение с использованием метода MuleClient.dispatch .

Запланированные задачи в базе данных

Таблица SCHEDULABLETASKCONFIGURATIONS содержит одну строку для каждой запланированной задачи. Различные столбцы содержат следующую информацию:

Имя столбца

Описание

НАЗВАНИЕ Имя планируемого задания. Должно быть уникальным.
TASKGROUPNAME Имя группы планируемых задач, к которой относится задача.
ДАТА НАЧАЛА Дата начала выполнения задачи в соответствии с выражением cron.
ДАТА ОКОНЧАНИЯ Дата, после которой задача больше не будет выполняться.
CRONEXPRESSION Выражение cron решает, когда задача будет выполнена. Более подробная информация по адресу: http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/crontrigger .
INBOUNDENDPOINTURI URI конечной точки, который будет опрошен для сообщения при выполнении задачи.
Дополнительная информация доступна по адресу: http://www.mulesoft.org/documentation/display/current/Mule+Endpoint+URIs.
INBOUNDTIMEOUT Время в миллисекундах, в течение которого Ковбой сообщений будет ожидать сообщения при опросе входящей конечной точки, прежде чем сдаться.
OUTBOUNDENDPOINTURI URI конечной точки, на который будут доставляться сообщения, полученные при опросе входящей конечной точки.
Дополнительная информация доступна по адресу: http://www.mulesoft.org/documentation/display/current/Mule+Endpoint+URIs.
TASKENABLEDFLAG Позволяет отключить задачи передачи сообщений без необходимости удалять их настройки в базе данных. Истина означает, что задача включена.

Добавить задачу передачи сообщений

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

Теперь мы добавим задачу передачи сообщений, которая перемещает файл из одного каталога в другой каталог каждые 30 секунд, и отметим, каким образом вы будете информированы о обнаружении новой задачи.

  • Используя свой любимый клиент базы данных, например SQuirreL или проводник источников данных в Eclipse, подключитесь к базе данных Message Cowboy, используя следующие параметры:
    URL базы данных: jdbc: hsqldb: hsql: // localhost: 9001 / mc-db
    Имя пользователя: sa
    Пароль : (пустая строка)
    База данных: mc-db
    Параметры соединения можно найти и изменить в файле «message-cowboy-configuration.properties».
    Если вы используете обозреватель источников данных Eclipse, используйте записную книжку SQL, а не редактор таблиц, поскольку у меня возникли проблемы с вводом логических значений в редакторе таблиц.

  • База данных должна быть пустой, и мы добавляем новую строку, используя оператор SQL ниже.
    Обратите внимание, что поскольку в конфигурации транспортной службы Message Cowboy имеется несколько файловых соединителей, нам необходимо явно указать, какой файловый соединитель использовать в URI конечной точки.

INSERT INTO SCHEDULABLETASKCONFIGURATIONS (
  NAME, TASKGROUPNAME, CRONEXPRESSION, STARTDATE,
  ENDDATE, INBOUNDENDPOINTURI, INBOUNDTIMEOUT,
  OUTBOUNDENDPOINTURI, TASKENABLEDFLAG)
VALUES (
  'FileMover', 'DemoGroup', '*/30 * * * * ?',
  '2014-01-01', '2015-12-31',
  'file://INBOX?connector=streamingFileConnectorInbound', '500',
  'file://OUTBOX?connector=streamingFileConnectorOutbound', 'true')
  •  Посмотрите журнал в консоли. Когда запланированные задачи обновляются, новая задача найдена и запланирована. Запишите имя задачи и имя группы задач.
[EL Fine]: sql: 2014-07-28 19:20:40.115--ServerSession(1062205019)--Connection(1572688128)--SELECT NAME, CRONEXPRESSION, ENDDATE, INBOUNDENDPOINTURI, INBOUNDTIMEOUT, OUTBOUNDENDPOINTURI, STARTDATE, TASKENABLEDFLAG, TASKGROUPNAME FROM SchedulableTaskConfigurations
2014-07-28 19:20:40,115 DEBUG se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Found 1 number of tasks
2014-07-28 19:20:40,115 DEBUG se.ivankrizsan.messagecowboy.services.scheduling.QuartzSchedulerHelper - Scheduled task FileMover in group DemoGroup
2014-07-28 19:20:40,115 DEBUG se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Scheduled task FileMover in group DemoGroup
2014-07-28 19:20:40,115 INFO  se.ivankrizsan.messagecowboy.services.starter.MessageCowboyStarterServiceImpl - Successfully (re)scheduled Message Cowboy tasks

Прежде чем опробовать новую задачу по передаче сообщений, мы рассмотрим конфигурацию транспортного сервиса.

Конфигурация транспортной службы

Файлы конфигурации транспортных служб в этом воплощении Message Cowboy представляют собой файлы конфигурации Mule XML. Такие файлы могут содержать, среди прочего:

  • Разъемы.
    Включение опроса и доставки на различные типы конечных точек и / или конечных точек с различными конфигурациями.
  • Потоковые конструкции.
    Допускается, например, обработка сообщений до их доставки в конечную точку назначения.

Расположение файлов конфигурации транспортной службы

В настоящее время существует два каталога, в которые можно поместить файлы конфигурации Mule XML, чтобы Message Cowboy обнаружил конфигурации транспортных служб:

  • производство-конфигурации / разъемы /

  • производство-конфигурация / транспортно-сервис-конфигурация /

Файлы в указанных выше каталогах должны иметь суффикс .xml для загрузки транспортной службой.

Транспортная служба не делает различий между файлами конфигурации из разных каталогов — они просто удобны для пользователя приложения, позволяя ему / ей классифицировать конфигурации.
Количество и расположение этих каталогов конфигурации транспортной службы можно настроить в классе конфигурации MessageCowboyConfiguration Spring.

Заметка!

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

Добавить файл конфигурации транспортной службы

Чтобы увидеть, что происходит при добавлении нового файла конфигурации транспортной службы, следующий файл конфигурации Mule будет помещен в один из каталогов, содержащих файлы конфигурации транспортной службы:

<?xml version="1.0" encoding="UTF-8"?>
<mule
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">

    <flow name="testflow">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081"/>
        <set-payload value="Howdy from the Message Cowboy!" />
    </flow>
</mule>
  •  В каталоге «« production-configurations »создайте директорию с именем« transport-service-configurations », если она еще не существует.
  • В каталоге «transport-service-configurations» создайте новый файл с именем «example-config.xml» и вставьте указанную выше конфигурацию Mule в этот файл.

  • Соблюдайте консоль.
    Через некоторое время будет довольно некоторый вывод, так как встроенный экземпляр Mule останавливается и перезапускается, начиная с этих строк:

    2014-07-28 18:16:30,005 INFO  se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Started executing task MessageCowboyTransportServiceRefreshTask in group MessageCowboySystemTasks
    2014-07-28 18:16:30,005 DEBUG se.ivankrizsan.messagecowboy.services.scheduling.MethodInvokingJob - Invoking the method refreshConnectors on object of the type se.ivankrizsan.messagecowboy.services.transport.MuleTransportService with the parameters []
    2014-07-28 18:16:30,008 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 2 connector configuration files using the pattern file:production-configurations/connectors/*.xml
    2014-07-28 18:16:30,011 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 1 connector configuration files using the pattern file:production-configurations/transport-service-configurations/*.xml
    2014-07-28 18:16:30,011 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Detected change in configuration resources, refreshing
    2014-07-28 18:16:30,013 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 2 connector configuration files using the pattern file:production-configurations/connectors/*.xml
    2014-07-28 18:16:30,015 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Found 1 connector configuration files using the pattern file:production-configurations/transport-service-configurations/*.xml
    2014-07-28 18:16:30,022 INFO  org.mule.module.client.MuleClient - Initializing Mule...
  •  В любом веб-браузере вставьте URL-адрес http: // localhost: 8081.
    В окне браузера должно появиться приветствие от Ковбоя сообщений.

Обратите внимание, что этот пример конфигурации, вероятно, был бы более подходящим для развертывания в автономном экземпляре Mule, а не в ковбое сообщений, поскольку он не включает никаких запланированных действий.

  • Удалите файл «example-config.xml», который вы создали ранее.

  • Соблюдайте консоль.
    Через некоторое время вы увидите, что модификация обнаружена и встроенный клиент Mule перезапущен еще раз.

Пример передачи файла

При наличии вышеуказанных конфигураций и включенном и работающем Message Cowboy теперь мы рассмотрим сообщение, передаваемое запланированной задачей, созданной ранее:

  • В Eclipse создайте папку с именем «INBOX» в корневом каталоге проекта Message Cowboy.

  • Снова в Eclipse создайте еще одну папку с именем «OUTBOX» также в корневом каталоге проекта.

  • Скопируйте и вставьте произвольный файл в каталог INBOX.

  • Подождите как минимум 30 секунд.

  • Обновите проект в Eclipse (F5 или щелкните проект правой кнопкой мыши и выберите «Обновить»).

  • Соблюдайте каталог OUTBOX.

Если все работает должным образом, файл должен быть перенесен из каталога INBOX в каталог OUTBOX. Передача файлов должна генерировать журнал, похожий на этот в консоли:

2014-07-28 18:54:20,115 DEBUG se.ivankrizsan.messagecowboy.domain.entities.impl.QuartzMuleTaskJob - Started executing job FileMover in group DemoGroup
2014-07-28 18:54:20,115 DEBUG se.ivankrizsan.messagecowboy.domain.entities.impl.QuartzMuleTaskJob - Executing mover task job FileMover
2014-07-28 18:54:20,130 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Received message: 
org.mule.DefaultMuleMessage
{
  id=61ae6aef-162c-11e4-86aa-553bdf28c94e
  payload=org.mule.transport.AbstractConnector$7
  correlationId=<not set>
  correlationGroup=-1
  correlationSeq=-1
  encoding=UTF-8
  exceptionPayload=<not set>

Message properties:
  INVOCATION scoped properties:
  INBOUND scoped properties:
    directory=/Users/ivan/MyWorkspace/message-cowboy-master/INBOX
    fileSize=35120
    originalFilename=myFile.xml
    timestamp=1234567890123
  OUTBOUND scoped properties:
    MULE_ENCODING=UTF-8
    originalFilename=myFile.xml
  SESSION scoped properties:
}
2014-07-28 18:54:20,161 DEBUG se.ivankrizsan.messagecowboy.domain.entities.impl.QuartzMuleTaskJob - Message received from file://INBOX?connector=streamingFileConnectorInbound: se.ivankrizsan.messagecowboy.domain.entities.impl.MuleMoverMessage@5e8c1f43
2014-07-28 18:54:20,161 DEBUG se.ivankrizsan.messagecowboy.domain.entities.impl.QuartzMuleTaskJob - Dispatching message to file://OUTBOX?connector=streamingFileConnectorOutbound
2014-07-28 18:54:20,193 DEBUG se.ivankrizsan.messagecowboy.services.transport.MuleTransportService - Sent message: se.ivankrizsan.messagecowboy.domain.entities.impl.MuleMoverMessage@5e8c1f43
2014-07-28 18:54:20,193 INFO  org.mule.transport.ConnectableLifecycleManager - Initialising: 'streamingFileConnectorOutbound.dispatcher.1193542816'. Object is: FileMessageDispatcher
2014-07-28 18:54:20,193 INFO  org.mule.transport.ConnectableLifecycleManager - Starting: 'streamingFileConnectorOutbound.dispatcher.1193542816'. Object is: FileMessageDispatcher
2014-07-28 18:54:20,193 INFO  org.mule.transport.file.FileConnector - Writing file to: /Users/ivan/MyWorkspace/message-cowboy-master/OUTBOX/myFile.xml

 Содержимое файла, находящегося в каталоге OUTBOX, должно быть идентично оригинальному файлу.

логирование

В приведенных выше примерах у нас был включен журнал отладки для журнала, созданного Message Cowboy. Иногда может потребоваться уменьшить объем журнала или увеличить объем журнала для определенных пакетов и т. Д.
Это может быть достигнуто путем создания файла конфигурации Log4J и, при запуске Message Cowboy, установки соответствующего системного свойства, указывающего на конфигурацию Log4J. файл.

В этом примере я создал пользовательский файл конфигурации Log4J с именем mylog4j.xml:

java -Dlog4j.configuration=mylog4j.xml -jar message-cowboy-1.0.0-SNAPSHOT.jar

Будущее

Некоторые мысли, которые у меня есть о будущем Message Cowboy, в произвольном порядке:

  • Графический интерфейс для настройки запланированных задач.
    Это делает интеграцию действительно настраиваемой, без необходимости программирования и менее подверженной ошибкам.
  • Альтернативная реализация транспортного сервиса с использованием Apache Camel.
  • Добавление возможности указать набор свойств, связанных с запланированной задачей, которые передаются транспортной службе при запросе и отправке сообщений.
    Это позволило бы разработать более общие конфигурации транспортных услуг.
  • Альтернативная реализация службы планирования.
    Если я когда-нибудь найду какую-то структуру планирования, которая является серьезной, бесплатной альтернативой Quartz.
  • Включает некоторые основные, часто используемые конфигурации транспортных услуг.
    Например, готовая к использованию конфигурация для гарантированной доставки сообщений.

Предложения и пожелания приветствуются — пожалуйста, разместите такие запросы как проблему на GitHub: https://github.com/krizsan/message-cowboy/issues