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