W jaki sposób stworzyć własny listener jPALIO?

Klasą bazową dla wszystkich listenerów jPALIO jest klasa palio.listeners.PalioListener. Aby stworzyć własny listener należy stworzyć klasę JAVA dziedziczącą po tej klasie. W pierwszym etapie tworzenia listenera klasa listenera powinna wyglądać w następujący sposób:

package sample.listener;

import java.util.Properties;

import palio.Instance;
import palio.listeners.PalioListener;


public class SampleListener extends PalioListener {

public SampleListener(String name, Instance instance, Properties properties) {
super(name, instance, properties);
}

@Override
public void close() {

}

}

Listener najczęściej kojarzony jest z procesem nasłuchującym na jakieś zdarzenia. Startowanie takich procesów (np. otwieranie nasłuchujących soketów, lub tworzenie nowych wątków) powinno odbywać się w konstruktorze. Dobrą praktyką jest wyniesienie kodu startującego do innej metody i wywołanie jej w konstruktorze. Zwiększa to czytelność kodu. W kolejnych wersjach jPALIO listenery będą posiadały swój cykl życia, który uporządkuje proces inicjalizacji, startu, zatrzymywania i zwalniania zasobów.

Metoda close jest wywoływana w momencie zwalniania zasobów instancji jPALIO podczas jej zamykania. W przypadku alokowania zasobów przez dany listener w chwili startu lub w trakcie jego działania metoda ta ma za zadanie zwolnienie wszystkich tych zasobów (np. zamykanie otwartych połączeń, zatrzymywanie procesów nasłuchujących itd).

Stworzoną klasę należy skompilować i umieścić ją serwerze. W przypadku mało skomplikowanych listenerów moża skopiować skompilowaną klasę do katalogu WEB-INF/classes. Klasie listenera mogą towarzyszyć inne powiązane klasy stąd zalecanym sposobem wgrywania listenera na serwer jest zbudowanie archiwum JAR w którym powinny znaleźć się klasa listenera oraz wszystkie klasy powiązane a następnie wgranie go do katalogu WEB-INF/lib.

Szkielet prostego listenera może wyglądać w ten sposób:

package sample.listener;

import java.util.Properties;

import palio.Current;
import palio.Instance;
import palio.listeners.PalioListener;


public class SampleListener extends PalioListener {

private boolean running = false;

public SampleListener(String name, Instance instance, Properties properties) {
super(name, instance, properties);
start();
}

@Override
public void close() {
running = false;
}

public void start() {
running = true;
Thread thread = new Thread(new Runnable() {

public void run() {
// Setting a Current is required to make possible invoking most methods of jPALIO modules.
Current threadCurrent = new Current(getInstance());
Instance.setCurrent(threadCurrent);
while (running) {
// Some listening code
}
}
});

thread.setName("jPALIO - " + instance.getName() + " - " + getClass().getName() + " listener");
thread.setDaemon(true);
thread.start();
}

}