我们的应用程序在8节点Weblogic集群中运行,并尝试与RMI服务器通信。这样做的线程由于RMI服务器中的错误而卡住了。我们正试图解决这个问题,但问题是,在此之前,卡住的线程会降低应用程序的速度,最终导致整个群集瘫痪。
我的问题是'我们怎么能从客户端确保线程被释放?'
非常感谢任何帮助。
实施细节: - Weblogic 10.0MP2,具有8个节点的集群 - Java 1.5
线程转储片段:
"[STUCK] ExecuteThread: '15' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x03808610 nid=0x1c9 runnable [0
x3ed4e000..0x3ed4faf0]
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:235)
- locked <0xa0a515a0> (a java.io.BufferedInputStream)
at java.io.DataInputStream.readByte(DataInputStream.java:241)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:189)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at com.kpno.in.iac.CustomerBridge.CustomerBridge.RemoteDecorator_Stub.sendMessage(Unknown Source)
at com.kpno.in.iac.CustomerBridge.RMIServer.CustomerBridgeProxy.sendMessage(Unknown Source)
应用程序代码段(已反编译):
public final class RemoteDecorator_Stub extends RemoteStub
implements ...
{
...
public Map sendMessage(String paramString1, String paramString2, Map paramMap)
throws InvalidActionException, ProcessingException, PropagationException, ResponseException, TimeoutException, RemoteException
{
try
{
Object localObject = this.ref.invoke(this, $method_sendMessage_2, new Object[] { paramString1, paramString2, paramMap }, 6494150482049562645L);
return (Map)localObject;
}
catch ...
更新
我试图让它与Tolis提议的JNDI查找一起工作,但直到现在我还没有成功。我想知道网址应该是什么。从RMI命名检索如下: java.rmi.Naming.lookup( “//主机:端口/工厂对象”)
如何将其转换为JNDI网址?我已尝试使用t3作为协议并使用iiop。没有任何效果。我总是得到一个命名例外。
如果是t3,我会收到此异常: [根异常是java.net.ConnectException:t3:// host:port:Destination unreachable;嵌套异常是:java.io.IOException:空服务器回复;没有可用的路由器到目的地]
在iiop的情况下,我得到这个例外: javax.naming.CommunicationException:无法连接到ORB [根异常是org.omg.CORBA.COMM_FAILURE:vmcid:SUN次要代码:201已完成:否]
有什么想法吗?
答案 0 :(得分:0)
您可以使用 weblogic.rmi.clientTimeout 设置,以避免在目标服务器遇到问题时发生线程卡住情况。
<强>编辑:强>
当您尝试从套接字读取并且未从服务器获得任何响应时,另一个有用的解决方案如下:
RMI运行时使用RMISocketFactory实例来获取RMI调用的客户端和服务器套接字。应用程序可以使用setSocketFactory方法请求RMI运行时使用其套接字工厂实例而不是默认实现。
实施例:
RMISocketFactory.setSocketFactory(new RMISocketFactory()
{
public Socket createSocket(String host, int port) throws IOException {
Socket s = new Socket();
s.setSoTimeout(timeoutInMilliseconds);
s.setSoLinger(false, 0);
s.connect(new InetSocketAddress(host, port), timeoutInMilliseconds);
return s;
}
public ServerSocket createServerSocket(int port) throws IOException {
return new ServerSocket(port);
}
});
setSocketFactory设置RMI从中获取套接字的全局套接字工厂。