Apache Mina - obsługa długotrwałych zadań

Apache Mina - obsługa długotrwałych zadań
TD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Cześć.
Zastanawiam się nad prostym TCP serverem na zasadzie pytanie-odpowiedź takim jak ten:
https://mina.apache.org/mina-project/userguide/ch2-basics/ch2.2-sample-tcp-server.html
W którym miejscu powinienem umieścić długotrwałe zadania typu żądania do innych serwerów albo do DB, by nie zablokować innych klientów?

Kopiuj
//nad innymi filtrami
filerChain.addLast("executor", new ExecutorFilter(Executors.newVirtualThreadPerTaskExecutor()));


//iohandleradapter
@Override
public void messageReceived( IoSession session, Object message ) throws Exception
{
    //długotrwałe zadanie lub Thread.sleep(100_000);
}

Jeśłi dobrze zrozumiałem to zdarzenie moze nie być po kolei teraz tylko jednocześnie z innymi, bo zmieniłem pule wątków w executor filter na inną?
It is because all events generated by MINA are transmitted to your handler in order (when using the Executor Filter), and the newer event is not processed if the event handler method for the older event for the same session hasn’t returned yet.

Jak zrobić żeby mieć tak samo jak w klasycznym przypadku ServerSocket bez przejmowania się kolejnością? W dużym uproszczeniu:

Kopiuj
var serverSocket = new ServerSocket(8080);
while (true) {
  Thread.startVirtualThread(new MyRunnable(serverSocket.accept()));
}
class MyRunnable implements Runnable
{
    final private Socket socket; 
    public MyRunnable(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        while (true) {
            try {
                var request = socket.getInputStream().readNBytes(1024);//
                //długotrwałe zadanie przyjmuje request i zwraca response... 
                socket.getOutputStream().write(response);
            } catch (IOException e) {
                e.printStackTrace();;
            }
        }
    }
}
damianem
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 205
1

Sprawdź dokumentację ExecutorFilter dla Twojej wersji - np. tutaj jest sekcja "Event Ordering" która wszystko raczej jasno opisuje: https://nightlies.apache.org/mina/mina/2.1.4/apidocs/org/apache/mina/filter/executor/ExecutorFilter.html.
Według powyższego, jako że podałeś własną implementację executora do filtra, to nie masz żadnych gwarancji odnośnie kolejności obsłużenia eventów i mogą one być obsługiwane równolegle.
Z tego co widzę ExecutorFilter ma mnóstwo przeładowanych konstruktorów, które tworzą thread pool o takim rozmiarze jak chcesz i który będzie "managowany" przez Minę (zachowując kolejność eventów - OrderedThreadPoolExecutor).
Możesz tam nawet podać ThreadFactory które będzie tworzyło wątki wirtualne jeśli na tym Ci zależy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.