1

アプリケーションは 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 ルックアップで動作させようとしましたが、今まで成功しませんでした。URLをどうしようか悩んでいます。RMI ネーミングからの取得は、次のように行われます。 java.rmi.Naming.lookup("//host:port/FactoryObject")

これを JNDI URL に変換するにはどうすればよいですか? プロトコルとして t3 を使用し、iiop を使用してみました。何も機能しませんでした。私はいつも命名例外を受け取ります。

t3 の場合、次の例外が発生します。[ルート例外は java.net.ConnectException: t3://host:port: Destination unreachable; ネストされた例外: java.io.IOException: Empty server reply; 宛先への利用可能なルーターがありません]

iiop の場合、次の例外が発生します: javax.naming.CommunicationException: Cannot connect to ORB [Root exception is org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No]

何か案は ?

4

1 に答える 1

0

You could use the weblogic.rmi.clientTimeout setting in order to avoid thread stuck situations when the target server is experiencing problems.

EDITED:

Another solution which is useful when you are trying to read from a socket and you are not getting any response from the server is the following:

An RMISocketFactory instance is used by the RMI runtime in order to obtain client and server sockets for RMI calls. An application may use the setSocketFactory method to request that the RMI runtime use its socket factory instance instead of the default implementation.

Implementation example:

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);
    }
});

The setSocketFactory sets the global socket factory from which RMI gets sockets.

于 2012-08-20T14:19:11.520 に答える