<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Jabber-нотификация в redmine</title><html>Просматривая статистику посещений, обратил внимание на то, что многих интересует словосочетание &laquo;redmine jabber&raquo;. Пришла пора удовлетворить спрос. В начале &laquo;как обычно&raquo; небольшая предыстория о том, &laquo;как всё начиналось&raquo;:&lt;/p&gt;
&lt;blockquote&gt; Несколько лет назад мне удалось внедрить &lt;a href=&quot;http://redmine.org/&quot;&gt;redmine&lt;/a&gt; на &laquo;производстве&raquo;, коллеги потихоньку втягиваясь в процесс, затребовали &laquo;книгу отзывов и предложений&raquo;. Одним из первых пожеланий была замена &lt;span title=&quot;политика настройки которых мягко говоря идиотская&quot;&gt;стандартных уведомлений по email&lt;/span&gt; на, успевшие уже войти в моду, &lt;a href=&quot;http://miracle.rpz.name/2009/02/24/commit-jabber-php/&quot;&gt;jabber-уведомления, которые мы используем для нотификации о новых коммитах в svn&lt;/a&gt;. Я вооружился тем самым поисковым запросом, о котором упомянул и немедленно нашёл нужной функциональности &lt;a href=&quot;https://github.com/mszczytowski/redmine_messenger/tree&quot; title=&quot;Messenger plugin for Redmine&quot;&gt;готовый плагин&lt;/a&gt;. Помимо уведомлений, автор обещал нам некие таймеры, которые можно стартовать/останавливать посредством команд боту в чате, тем самым &laquo;точно&raquo; подсчитывать затраченное на решение задачи время. В теории это казалось очень нужной и удобной игрушкой, на деле же оказалось, что плагин был выпилен для старой версии redmine и с trunk-версией работать по полной программе отказался. Худо-бедно он иногда стартовал какие-то таймеры, иногда присылал какие-то уведомления, от полученных команд иногда впадал в ступор и потом долго игнорировал собеседника, в общем  вёл себя непозволительно загадочно и непростительно таинственно, но скиллов для исправления обнаруженных проблем мне не хватало, а автор на открытые тикеты особо не реагировал. Мыши плакали, кололись и продолжали есть кактус до одного смешного стечения обстоятельств: я находился в другом городе, бессовестно тратил отпускное время на прогулки, осмотры достопримечательностей и дивных пейзажей, внезапно получил входящий звонок от коллег. Слёзно просили выручать - что-то мол случилось, трах-бах-тарарах ...и всё, нет у нас больше redmine. Немного порассуждав вслух, источник проблемы вроде бы вычислили, каким-то временным образом проблему по телефону решили, но в тот же вечер, добравшись до интернета, плагин я без сожалений выкинул. Случилось следующее &mdash; при старте redmine, плагин коннектился к jabber-серверу, а уж затем поднимался сам редмайн, но в тот роковой момент соединение с интернетом пропало, от чего случился обширный exception и redmine умер не приходя в сознание.
&lt;/blockquote&gt;
&lt;div align=&quot;center&quot;&gt;***&lt;/div&gt;
&lt;p&gt;
Тогда стало понятно, что схема со злобным плагином не работает и уведомления надо рассылать внешним по отношению к redmine решением (здесь знатоки rails могли бы долго возражать, но уже поздно). Параллельно с этой проблемой существовали другие.&lt;!--more--&gt; &lt;a href=&quot;http://miracle.rpz.name/2009/02/24/commit-jabber-php/&quot;&gt;Cкрипт, о котором уже упомянул выше&lt;/a&gt;, работал прямо скажем неэффективно. Во-первых он &lt;span title=&quot;казалось бы - какая разница?! часто что ли коммиты бывают? нет, но всё равно раздражает!&quot;&gt;соединялся с xmpp-сервером после каждого коммита&lt;/span&gt;, порой делал это долго, порой это у него не получалось, порой сообщения не доставлялись адресату, даже если соединение с сервером было успешным. Поэтому рассылку уведомлений сразу после коммита пришлось разбить на два шага: 1) положить в очередь сообщения для адресатов 2) забрать уведомление из очереди и разослать, после подтверждения доставки удалить его из очереди. Теперь второй скрипт запускался периодически (не после коммита) рассылал уведомления, удалял их из очереди (подтверждения о получении я реализовать не смог). По-прежнему оставалась проблема с пропадающими сообщениями. Немного покопавшись в недрах протокола я обнаружил что клиент получателя, сервер получателя или мой xmpp-сервер при возникновении ошибки возвращают моё сообщение но с типом &lt;em&gt;error&lt;/em&gt;: это значило, что периодический запуск &laquo;рассылатора-уведомлятора&raquo; не подходит &mdash; надо держать постоянное соединение с сервером и должным образом обрабатывать входящие сообщения. Так &laquo;в муках&raquo; родился прототип &lt;a href=&quot;http://miracle.rpz.name/2009/12/05/jabber-web-status/&quot;&gt;бота webstatus-а&lt;/a&gt;, а с ним и рабочая реализация механизма уведомлений по xmpp. Первоначально это был скрипт на php, который при запуске подключался к jabber-серверу, периодически дёргал mysql запросом на получение новых сообщений и рассылал их, помечал как отправленные, если потом возвращались ошибки - вновь отмечал сообщения как непрочитанные. В mysql-таблицу сообщения попадали от разных источников - от post-commit хука в svn, от различных скриптов, которые запускаются cron-ом и собирают необходимые нам данные. 
&lt;div align=&quot;center&quot;&gt;***&lt;/div&gt;
&lt;p&gt;
Таким образом прикрутить это решение к redmine стало просто делом техники &mdash; требовалось лишь сделать &laquo;триггеры&raquo; в нужных моделях, которые бы добавляли новые записи в таблицу с очередью сообщений для xmpp-бота. Уже позднее &lt;a href=&quot;http://miracle.rpz.name/2010/11/20/jabber-web-status-2/&quot;&gt;php-решение было переписано на модной нынче node-платформе&lt;/a&gt;. Потребовалась лишь прослойка в виде &lt;a href=&quot;http://code.nytimes.com/projects/dbslayer&quot;&gt;dbslayer&lt;/a&gt; для того чтобы соединить node и mysql.
&lt;p&gt; Теперь всё выглядит следующим образом:
&lt;ul&gt;
	&lt;li&gt;Сообщения от разных источников попадают в mysql (например :after_save в issue модели редмайна, post-commit хук в svn и т.д.)
        &lt;li&gt;Jabber-бот (на &lt;a href=&quot;http://nodejs.org&quot;&gt;node&lt;/a&gt;) периодически делает запрос в mysql (через &lt;a href=&quot;http://code.nytimes.com/projects/dbslayer&quot;&gt;dbslayer&lt;/a&gt;) вида &lt;code&gt;select msg, recipient from msg where recipient in (cписок тех, кто сейчас в онлайне)&lt;/code&gt;, если получен непустой результат, то сообщения отправляет адресату и отмечает их прочитанными.
        &lt;li&gt; Если сообщение вернулось с ошибкой - бот отмечает его непрочитанным, а адресата на некоторое время отправляет &laquo;на скамейку запасных&raquo; (чтобы не долбить его повторяющимися запросами)
        &lt;li&gt; Бот поддерживается на плаву с помощью &lt;a href=&quot;http://supervisord.org/&quot;&gt;supervisord&lt;/a&gt; (случаются ошибки, как правило сетевые, которые не удаётся поймать стандартными try-catch в коде бота, после некоторых попыток обработать все возможные проблемы я пришёл к выводу, что проще &laquo;упасть и товарищи поднимут&raquo; нежели пытаться &laquo;любой ценой устоять&raquo; &mdash; всё-таки данные не настолько критичные и безвозратная потеря сообщения терпима.
&lt;/ul&gt;
&lt;div align=&quot;center&quot;&gt;***&lt;/div&gt;
&lt;p id=&quot;download&quot;&gt; Тех, кто дочитал до этого места и всё ещё жаждет получить ссылку &lt;a href=&quot;#download&quot;&gt;&laquo;скачать&raquo;&lt;/a&gt; мне придётся огорчить &mdash; описанный код сильно заточен под наши конкретные нужды и планов его публикации не было, поэтому redmine-зависимая часть кода просто на-тяп-ляплена посреди моделей самого редмайна безо всякой попытки вынести эти части в отдельный плагин, node-часть тоже не обошлась без влезания в &laquo;чужие&raquo; библиотеки. А это всё значит лишь одно: plug-n-play решения у меня нет. Но &lt;a href=&quot;http://miracle.rpz.name/2011/06/27/redmine-with-jabber-notifications/#dsq-comments&quot;&gt;в комментариях&lt;/a&gt; вы можете попробовать наладить конструктивный диалог и мы совместными усилиями создадим работающий у вас плагин, с чаем и шахматистками. Вас это интересует?
</html><type>rich</type></oembed>