Тайм-аут Java RMI в обратном вызове - PullRequest
1 голос
/ 09 апреля 2010

Мы используем Java RMI для связи. Клиент RMI передает запрос обработки и объект с методом обратного вызова на сервер RMI. Сервер вызывает обратный вызов, когда это сделано с обработкой. Настройка аналогична описанной в Обратные вызовы RMI .

Иногда мы получаем исключение «тайм-аут чтения» на сервере при вызове метода обратного вызова. Поток обратного вызова останавливается примерно на минуту, прежде чем вызывается исключение.

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

Мы используем Sun Java JDK 1.6.0_18 в 32-разрядной версии Windows Server 2003.

Можно ли обойти проблемы с подключением, настроив системные свойства RMI?

1 Ответ

1 голос
/ 11 апреля 2010

Многие таймауты описаны в этом посте, достойном закладки: http://archives.java.sun.com/cgi-bin/wa?A2=ind0208&L=jini-users&P=R27617

В моем (ограниченном) опыте работы с JRMP я обнаружил, что мне нужно использовать глобальные свойства JVM для настройки таймаутов чтения ...

экскурс: Моя команда теперь использует исключительно Jeri (расширяемый удаленный вызов Java), который является частью проекта Apache River (ранее Sun Jini). Jeri гораздо более настраиваемый, чем JRMP, что позволяет вам определять свои собственные базовые протоколы.

...