【问题标题】:stuck threads in weblogic while trying to communicate over RMI尝试通过 RMI 通信时卡在 weblogic 中的线程
【发布时间】:2012-08-20 13:26:41
【问题描述】:

我们的应用程序在一个 8 节点 Weblogic 集群中运行,并试图与 RMI 服务器通信。由于 RMI 服务器中的错误,执行此操作的线程会卡住。我们正在尝试解决这个问题,但问题是在此之前,卡住的线程会减慢应用程序的速度,最终导致整个集群瘫痪。

我的问题是'我们如何从客户端确保线程被释放?'

非常感谢任何帮助。

实现细节: - Weblogic 10.0MP2,8节点集群 - Java 1.5

线程转储sn-p:

"[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)

应用sn-p(反编译):

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("//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:无法连接到 ORB [根异常是 org.omg.CORBA.COMM_FAILURE:vmcid:SUN 次要代码:201 已完成:否]

有什么想法吗?

【问题讨论】:

    标签: multithreading weblogic rmi


    【解决方案1】:

    您可以使用 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 从中获取套接字的全局套接字工厂。

    【讨论】:

    • 谢谢托利斯。我还不能确认这是对我有用的答案,但听起来确实如此。我会尽快这样做。
    • 请注意,我提供的示例中10秒的配置是随机的。您必须使用适合您情况的值调整 weblogic.rmi.clientTimeout。谢谢。
    • 我已经尝试让它与 Tolis 建议的 JNDI 查找一起工作,但直到现在我还没有成功。我想知道网址应该是什么。从 RMI 命名中检索如下: java.rmi.Naming.lookup("//host:port/FactoryObject") 如何将其转换为 JNDI url?我已经尝试使用 t3 作为协议并使用 iiop。没有任何效果。我总是得到一个命名异常。有什么想法吗?
    • 但这需要修改 RMI 服务器实现,不是吗?或者这也可以从客户端完成?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多