T
tuxedo
Gast
Hallo,
ja, der Titel ist ein wenig verzwickt..
Ich versuchs mal zu erklären was ich gerne machen will, aber nicht so recht weiß wie:
Ich hab einen Java NIO Server. Dieser kann verbindungen entgegen nehmen. Für die weitere Arbeit an der Verbindung ist ein sogenannter Selector zuständig. Jede Verbindung, repräsentiert durch einen "Channel", kann sich an so einem Selector registrieren und dem Selector mitteilen was sie gerne tun möchte: Auf Daten warten oder selbst Daten senden.
Bisher hab ich dafür _einen_ Thread der sich für _alle_ Clients um diese "ich will auf Daten warten" und "ich hab Daten die gesendet werden müssen" Events kümmert. Im Netz hab ich gelesen, dass man hierfür einen Dispatcher-Pool baut:
Links sieht man den Acceptor. Der nimmt die Verbindungen (Channels) an und übergibt sie dann einem Pool von Dispatchern die auf die kommenden und gehenden Events am Channel hören.
Und da steckt mein Problem:
Ich brauche eine Anzahl an Threads, die ich, nachdem sie gestartet wurden, mit Informationen versorge, auf welchem Channel sie für Events lauschen sollen. Und für diese Anzahl Threads brauch ich _einen_ Eingang wo ich Channels registrieren kann, und wo "blackboxartig" entschieden wird, welcher der Threads dafür benutzt wird.
Ein "ExecutorService" im Sinne des java.util.concurrent Packages ist dafür glaub ich ungeeignet:
Da kann ich doch einfach nur "Runnables" reinstecken die dann im Pool gestartet werden und laufen bis sie fertig sind. Ich brauch aber eine Anzahl an Threads die laufen und die dynamisch und möglichst gleich verteilt mit Channels registriert werden.
Okay, ich könnte einen 20 Threads großen ExecutorServer Pool definieren und mir die reingesteckten Runnables "merken". Aber das bringt mich ja nicht weiter: Die Dispatcher-Runnables haben ja keine beschränkte Laufzeit. Die laufen solange bis der Server beendet wird. Und außerdem bleibt dann noch das "Problem" mit dem verteilen der Channels auf die Threads...
Ich hab im Netz dazu (also dispatching bei NIO mit einem Pool) nix gefunden. Entweder es sind nur unvollständige Codebeispiel die lediglich das Prinzip des gesamten Systems erklären ( http://today.java.net/cs/user/print/a/350#dispatcher ), oder es wurde das Handtuch geworfen und einfach definiert: "Die Synchronisation ist zu viel Arbeit. Ich will lieber primitiven Code haben".
Naja, das mit der synchronisation haut in meinem Fall recht gut hin. Hab das schon recht gut durchdacht. Aber bei mir scheitert's irgendwie an dem Ansatz für den Dispatcher-Pool.
Any ideas?
ja, der Titel ist ein wenig verzwickt..
Ich versuchs mal zu erklären was ich gerne machen will, aber nicht so recht weiß wie:
Ich hab einen Java NIO Server. Dieser kann verbindungen entgegen nehmen. Für die weitere Arbeit an der Verbindung ist ein sogenannter Selector zuständig. Jede Verbindung, repräsentiert durch einen "Channel", kann sich an so einem Selector registrieren und dem Selector mitteilen was sie gerne tun möchte: Auf Daten warten oder selbst Daten senden.
Bisher hab ich dafür _einen_ Thread der sich für _alle_ Clients um diese "ich will auf Daten warten" und "ich hab Daten die gesendet werden müssen" Events kümmert. Im Netz hab ich gelesen, dass man hierfür einen Dispatcher-Pool baut:

Links sieht man den Acceptor. Der nimmt die Verbindungen (Channels) an und übergibt sie dann einem Pool von Dispatchern die auf die kommenden und gehenden Events am Channel hören.
Und da steckt mein Problem:
Ich brauche eine Anzahl an Threads, die ich, nachdem sie gestartet wurden, mit Informationen versorge, auf welchem Channel sie für Events lauschen sollen. Und für diese Anzahl Threads brauch ich _einen_ Eingang wo ich Channels registrieren kann, und wo "blackboxartig" entschieden wird, welcher der Threads dafür benutzt wird.
Ein "ExecutorService" im Sinne des java.util.concurrent Packages ist dafür glaub ich ungeeignet:
Da kann ich doch einfach nur "Runnables" reinstecken die dann im Pool gestartet werden und laufen bis sie fertig sind. Ich brauch aber eine Anzahl an Threads die laufen und die dynamisch und möglichst gleich verteilt mit Channels registriert werden.
Okay, ich könnte einen 20 Threads großen ExecutorServer Pool definieren und mir die reingesteckten Runnables "merken". Aber das bringt mich ja nicht weiter: Die Dispatcher-Runnables haben ja keine beschränkte Laufzeit. Die laufen solange bis der Server beendet wird. Und außerdem bleibt dann noch das "Problem" mit dem verteilen der Channels auf die Threads...
Ich hab im Netz dazu (also dispatching bei NIO mit einem Pool) nix gefunden. Entweder es sind nur unvollständige Codebeispiel die lediglich das Prinzip des gesamten Systems erklären ( http://today.java.net/cs/user/print/a/350#dispatcher ), oder es wurde das Handtuch geworfen und einfach definiert: "Die Synchronisation ist zu viel Arbeit. Ich will lieber primitiven Code haben".
Naja, das mit der synchronisation haut in meinem Fall recht gut hin. Hab das schon recht gut durchdacht. Aber bei mir scheitert's irgendwie an dem Ansatz für den Dispatcher-Pool.
Any ideas?