Во второй статье о 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