2010-04-09 8 views
1

Nous utilisons Java RMI pour la communication. Un client RMI transmet une demande de traitement et un objet avec une méthode de rappel à un serveur RMI. Le serveur appelle le rappel lorsqu'il a terminé le traitement. La configuration est similaire à celle décrite dans RMI Callbacks.Délai Java RMI en rappel

Occasionnellement, nous recevons une exception de "délai d'attente de lecture" dans le serveur lors de l'appel de la méthode de rappel. Le thread de rappel se bloque pendant environ une minute avant que l'exception ne soit déclenchée.

java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.net.SocketTimeoutException: Read timed out 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:286) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) 
    at $Proxy2.finished(Unknown Source) 
    at com.unrisk.db.grid.GridTask.invokeCallback(com.unrisk.db.grid.GridTask:1292) 
    at com.unrisk.db.grid.GridTask.invokeCallbacks(com.unrisk.db.grid.GridTask:1304) 
    at com.unrisk.db.service.tasks.EquityMDTask.afterRun(com.unrisk.db.service.tasks.EquityMDTask:276) 
    at com.unrisk.db.grid.GridTask.run(com.unrisk.db.grid.GridTask:720) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
    at java.io.DataInputStream.readByte(DataInputStream.java:248) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:228) 
    ... 12 more 

Nous utilisons Sun Java JDK 1.6.0_18 sous Windows Server 2003 32 bits.

Est-il possible de contourner les problèmes de connexion en ajustant les propriétés du système liées aux RMI?

Répondre

1

Beaucoup des délais d'attente sont décrites dans ce poste de signet digne: http://archives.java.sun.com/cgi-bin/wa?A2=ind0208&L=jini-users&P=R27617

Dans mon (limitée) expérience avec JRMP, j'ai trouvé que je devais utiliser les propriétés JVM globale pour modifier les lectures les délais d'attente .. Mon équipe utilise désormais exclusivement Jeri (Java extensible remote invocation), qui fait partie du projet Apache River (anciennement: Sun Jini). Jeri est beaucoup plus configurable que JRMP, vous permettant de définir vos propres protocoles sous-jacents.