Вот и пришло время опробовать свои силы не в туториалах и теории по Джаве, а в реальной задаче.
В одном из проектов, над которыми я сейчас работаю, одним из функциональных требований было «Возможность отправлять оповещения пользователям на 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.