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();
}
}