XMPP-PubSub w Java i nie tylko (cz. 1)

W ramach eksternistycznego zaliczenia przedmiotu Systemy internetowe, muszę wykonać aplikację w architekturze SOA z wykorzystaniem

XMPP-PubSub (XEP-0060). Jako, że temat jest ciekawy i (IMHO) przyszłościowy postaram się go przybliżyć w paru notkach.

Czego można się po tych notkach spodziewać ? Przede wszystkim działających (w chwili publikacji ;)) fragmentów kodu, opisów problemów jakie napotkałem podczas realizacji projektu … oraz ich rozwiązań. Wszystko oczywiście, jak to u mnie bywa, w mniej lub bardziej chaotycznej formie ;>

Na początek może trochę teorii i historii (oczywiście z mojego punktu widzenia).

Co to jest XMPP ? Cóż, część osób będzie kojarzyć ten termin z Jabber’em … i słusznie, sam Jabber jest przodkiem XMPP , jako że całość bazuje na XML’u jest to potężnenarzędzie” mogące służyć nie tylko do komunikacji w internecie, ale też do wielu innych celów.

Co to jest PubSub ? Właściwie to Publish-Subscribe; jest to jedna z wielu ” usług” jakie udostępnia XMPP, umożliwia ona “wystawianie” wiadomości. Dzięki wykorzystaniu Observer patter eliminuje zbędny ruch sieciowy (klient nie pyta serwera co 5 min “masz już coś dla mnie?” … “a może teraz masz ?”), umożliwa praktycznie natychmiastowe informowanie klientów o zmianach/nowościach.

Z czym to się je ? Właściwie to ze wszystkim i niczym … tj. na pewno potrzebny jest serwer Jabbera z zaimplementowaną obsługa pub-sub (może to być np. ejabberd2 czy jabberd2, ja będę używał tego pierwszego z racji że “posiadam” go od paru lat ;)) i to by był na tyle … no ale w sumie to jeszcze można by z tego zrobić jakis użytek, dosłownie “jakiś”. Tak więc będą nam do tego potrzebne jakieś biblioteki … z takowymi nie ma problemu, chwila googlania zaprowadziła mnie do (wspominanego wyżej) smack’a i su-smack’a. Ok, całkiem fajnie, mi się to podoba … tylko po co mi do tego jeszcze jakiś dodatkowy serwer i to jeszcze jabbera ? Jest on po to, żeby ułatwić sobie życie, robi on za taki “programowy switch”, z wykorzystaniem smack’a można na takim serwerze wystawić node’a z danymi i odpowiednią konfiguracją … i o nim poprostu zapomnieć, dalej nasza zewnętrzna aplikacja (czyli OpenSource’owy, całkowicie darmowy soft) zrobi za nas wszystko, tj. roześle informacje do tych klientów którzy się zapisali na listę chętnych do odebrania informacji (tutaj jest właśnie nasz Observer pattern). Architektura jest bardzo prosta, klient podłącza się do serwera i zapisuje się (lub jak kto woli subscribe’uje), na zdarzenia (eventy), z drugiej strony łączy się inny klient czy serwer i wystawia dane (tu się znowu powtórzę) reszte robi za nas Observer pattern i serwer jabbera. … Ok wszystko fajnie, no ale ja nie chce czy też nie mogę/nie umiem/nie mam gdzie (nie potrzebne skreślić) postawić taki serwer. Nie musisz ;P możesz użyć jakiegoś publicznego, wystarczy rejestracja (a czasem nawet i to nie jest wymagane).

Smack i su-smack. Obie biblioteki są open-source’owe, pierwszy na licencji Apache, a drugi na Stockholm university BSD License. Więc nie będą sprawiać żadnych problemów ;>. Obie są w całości napisane w Java’ie, trafiłem na nie po chwili google’ania 😉

OK, koniec tego długiego i nudnego wstępu, czas zabrać się za to co tygryski lubią najbardziej ;> … czyli konfiguracje … żartuje, oczywiście najlepszą częścią będzie kodowanie, ale chcąc być trendy i wogole super … zwłaszcza, że oba projekty na to pozwalają … chciał bym przedstawić konfigurację maven‘a. W pliku pom.xml w sekcji repositories dodajemy repo (lub jak kto woli można to zrobić w $M2_HOME/setttings.xml, ale lepiej nie uzależniać projektu od globalnej konfiguracji ;))


it.su.se
su-smack
http://maven.it.su.se/it.su.se/maven2

natomiast do sekcji dependenties dodajemy:


su-smack
su-smack
1.4-SNAPSHOT

Teraz właściwa część notki … kod ;>. Najpierw założenia, chcemy się podlaczyć do serwera jabber’a, zalogować się i stworzyć w węzeł, dodatkowo dodam PacketListener żeby widzieć jak wygladą komunikacja pomiędzy serwerem jabber’a, a kodem. Kod nie jest zaawansowany więc nie sądze żeby wymagał opisu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
 * 	Published on GNU GPLv2
 */
package org.luksza.xmpp.pubsub;
 
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.IQ.Type;
import se.su.it.smack.pubsub.PubSub;
import se.su.it.smack.pubsub.elements.ConfigureElement;
import se.su.it.smack.pubsub.elements.CreateElement;
 
/**
* @author Dariusz [LocK] Łuksza
*/
public class PubSubCreateNode {
 
    public static void main(final String[] argv) throws Exception {
        final String login = "login";
        final XMPPConnection con = new XMPPConnection("jabber.host");
        con.connect();
        con.addPacketListener(new PacketListener() {
            public void processPacket(Packet pkt) {
                System.out.println(pkt.toXML());
            }
        }, null);
        try {
            con.login(login, "pass");
            if (con.isAuthenticated()) {
                final PubSub pubSub = new PubSub();
                pubSub.setType(Type.SET);
                pubSub.setTo("pubsub.jabber.host");
                pubSub.setFrom(con.getUser());
                pubSub.addChild(new CreateElement("/home/jabber.host/" + login));
                pubSub.addChild(new ConfigureElement());
                con.sendPacket(pubSub);
                Thread.sleep(5000);
            } else {
                System.out.println("Not authenticated!");
                return;
            }
        } finally {
            con.disconnect();
        }
    }
}

Po uruchowmieniu, używając jakiegoś klienta jabber’a (tkabber’a czy np. psi) możemy sprawdzić czy węzeł został utworzony. Należy pamiętać o tym że nie można tworzyć wiely węzłów naraz.I to by było chyba na tyle 😉

1 Comment XMPP-PubSub w Java i nie tylko (cz. 1)

  1. Pingback: Dariusz [LocK] Łuksza » XMPP-PubSub w Java (cz. 2)

Leave a Reply

Your email address will not be published. Required fields are marked *