Heb het volgende probleem bij een RMI client-server systeem, waarbij de clients zich als event listener kunnen registreren. Het versturen van events geschiedt door middel van callbacks naar de geregistreerde clients. In dat geval heeft de server de rol van RMI client. Het versturen van deze events gebeurt in een aparte thread, zodat het geen invloed heeft op inkomende remote method calls bij de server. Nu het volgende probleem:
sommige clients "verdwijnen" zonder zich als listener te hebben afgemeld. Dat kan bijvoorbeeld gebeuren door netwerkproblemen of doordat de client in hibernate gaat, crasht o.i.d. De server krijgt dit uiteraard niet mee (weak references voor het opslaan van de listeners werkt via RMI niet) en probeert de betreffende listener een event te sturen. Dit doe hij door de List met listeners te locken en in een for-loop elk het event te sturen. Nu duurt het soms tot wel 15 minuten voordat deze callback met een exception komt (een java.rmi.ConnectIOException: Exception creating connection to: xxx.xxx.xxx.xxx; nested exception is: java.net.NoRouteToHostException: No route to host).
Het locken van de listeners heeft tot gevolg dat gedurende deze 15 minuten andere clients zich niet kunnen aanmelden (als listener registeren) of afmelden (als listener deregistreren). Mijn vraag is dus: hoe kan ik sneller ontdekken dat een client niet meer reageert en dat de callback dus opgegeven moet worden?
sommige clients "verdwijnen" zonder zich als listener te hebben afgemeld. Dat kan bijvoorbeeld gebeuren door netwerkproblemen of doordat de client in hibernate gaat, crasht o.i.d. De server krijgt dit uiteraard niet mee (weak references voor het opslaan van de listeners werkt via RMI niet) en probeert de betreffende listener een event te sturen. Dit doe hij door de List met listeners te locken en in een for-loop elk het event te sturen. Nu duurt het soms tot wel 15 minuten voordat deze callback met een exception komt (een java.rmi.ConnectIOException: Exception creating connection to: xxx.xxx.xxx.xxx; nested exception is: java.net.NoRouteToHostException: No route to host).
Het locken van de listeners heeft tot gevolg dat gedurende deze 15 minuten andere clients zich niet kunnen aanmelden (als listener registeren) of afmelden (als listener deregistreren). Mijn vraag is dus: hoe kan ik sneller ontdekken dat een client niet meer reageert en dat de callback dus opgegeven moet worden?
If the world wouldn't suck, we'd all fall off