Feed Rss



Окт 13 2009

Java XMPP bot

рубрика: Java Автор:

Вот и пришло время опробовать свои силы не в туториалах и теории по Джаве, а в реальной задаче.

В одном из проектов, над которыми я сейчас работаю, одним из функциональных требований было «Возможность отправлять оповещения пользователям на XMPP аккаунт». Решением «в лоб» могло бы стать следующее:

  • Скачать XMPP client library для PHP (разработка ведется на PHP)
  • В контроллере, где должно отправляться сообщение, проводить коннект по заданным параметрам к нашему XMPP акканту и отправлять сообщения на нужный адрес

Но сразу же становятся очевидными минусы такого подхода:

  • соединение с XMPP сервером довольно дорогая операция по ресурсам и проходит слишком долго
  • постоянное создание и разрывание соединений с сервером не самое лучшее решение, так как если использовать google talk сервер, например, то есть шанс оказаться забаненым на некоторое время
  • если пользователей в системе будет много, то данное решение просто не будет успевать создавать необходимое кол-во соединений. будет много конкурирующих запросов и врядли все из них успеют завершиться. как итог — не все сообщения дойдут до адресата

Верное решение — написать демона, который единажды соединяется с сервером, а затем ждет обращения для отправки сообщений и собственно отправляет их не отсоединяясь от сервера.

Главное не извратить идею и не начать писать демона на PHP. Уже не раз сталкивались с тем, что скрипты-демоны, написанные на PHP, являются крайне нестабильной субстанцией из-за утечек памяти.

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

Представляю итог двухчасового решения (от момента создания проекта и до момента окончательного коммита в svn)

Качаем
xmpp-daemon-0.0.1-SNAPSHOT-jar-with-.jar
Запускаем (для UNIX) и соединяемся:
$ java -cp xmpp-daemon-0.0.1-SNAPSHOT-jar-with-dependencies.jar ua.net.tokar.xmpp_daemon.XmppBot -username $username -password $password -port 7777 -host localhost
$ telnet localhost 7777

Теперь что бы отправить сообщение нужно первой строкой передать адрес получателя (например: azazel.tap@gmail.com), а в последующих строках — сообщение для отправки. После закрытия соединения сообщение будет отправлено.

Исходники: SocketProcessor, XmppBot.

Понравился пост? Подпишись на RSS!

Метки: , , , ,