ejb2.x缓存远程接口@客户端

时间:2013-07-07 01:50:50

标签: caching websphere

在一个有点旧的应用程序中,BizDelegateServiceLocator用作客户端模式。出于某种原因,BizDelegate被缓存了。 手段,Home和Remote接口正在缓存并在大约100个线程之间共享。 BizDelegate中的方法也未同步。

我们遇到了一些问题。

  1. 写入socket时客户端的线程问题?(因为单个对象试图在线程之间共享)
  2. 进行部署时,总是需要重启客户端吗?(因为存储了远程接口,并且部署了不同的引用)。 我们在服务器端有服务器EJB池大小500 ejb对象实例。
  3. 这是否意味着我们只使用home.create()时创建的一个EJB实例?它是一种单身人士吗? 我们使用IBM Websphere AppServer 7V。

    用于处理旧版本的相同代码。

    我们在日志中可以看到的异常。

    0000003a ThreadMonitor W WSVR0605W:线程“WebContainer:76”(0000010f)已激活618203毫秒且可能挂起。服务器中总共有1个线程可能挂起。

    at com.ibm.rmi.util.buffer.SimpleByteBuffer.flushTo(SimpleByteBuffer.java:174)
       at com.ibm.rmi.iiop.IIOPOutputStream.writeTo(IIOPOutputStream.java:541)
       at com.ibm.rmi.iiop.Connection.write(Connection.java:2213)
    at com.ibm.rmi.iiop.Connection.sendFragment(Connection.java:2438)
    at com.ibm.rmi.iiop.IIOPOutputStream.sendFragment(IIOPOutputStream.java:202)
    at com.ibm.rmi.iiop.CDRWriter.completeFragment(CDRWriter.java:659)
    at com.ibm.rmi.iiop.CDROutputStream.alignAndReserve(CDROutputStream.java:276)
    at com.ibm.rmi.iiop.CDROutputStream.writeOctetArrayPiece(CDROutputStream.java:694)
    at com.ibm.rmi.iiop.CDROutputStream.write_octet_array(CDROutputStream.java:670)
    at com.ibm.rmi.iiop.CDROutputStream.write_octet_array(CDROutputStream.java:664)
    at com.ibm.rmi.iiop.ClientRequestImpl.write_octet_array(ClientRequestImpl.java:734)
    at com.ibm.rmi.ServiceContext.write(ServiceContext.java:121)
    at com.ibm.rmi.iiop.RequestMessage.write(RequestMessage.java:449)
    at com.ibm.rmi.iiop.ClientRequestImpl.<init>(ClientRequestImpl.java:188)
    at com.ibm.rmi.iiop.GIOPImpl.createRequest(GIOPImpl.java:185)
    at com.ibm.rmi.corba.ClientDelegate._createRequest_WLM(ClientDelegate.java:1874)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1061)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1143)
    at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java:1259)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1042)
    at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java:1225)
    at com.ibm.rmi.corba.ClientDelegate.request(ClientDelegate.java:1685)
    at com.ibm.CORBA.iiop.ClientDelegate.request(ClientDelegate.java:1181)
    at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java:458)
    

    另一个

    WebContainer : 37" daemon prio=3 tid=0x00000001050d9000 nid=0xe6 runnable [0xfffffffe3aff7000]
       java.lang.Thread.State: RUNNABLE
      at java.net.SocketOutputStream.socketWrite0(Native Method)
      at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
      at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
      at com.ibm.jsse2.d.a(d.java:66)
      at com.ibm.jsse2.d.a(d.java:108)
      at com.ibm.jsse2.SSLSocketImpl.b(SSLSocketImpl.java:337)
      at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:594)
      at com.ibm.jsse2.k.write(k.java:18)
      - locked <0xfffffffe9ca84e08> (a com.ibm.jsse2.k)
      at com.ibm.rmi.util.buffer.SimpleByteBuffer.flushTo(SimpleByteBuffer.java:152)
      - locked <0xfffffffe9ca84e08> (a com.ibm.jsse2.k)
    

1 个答案:

答案 0 :(得分:0)

没有这样的“ejb 2.4”。你的意思是EJB 2.1吗?

多个客户端线程写入同一套接字时没有线程问题。排除错误,ORB将在同一套接字连接上多路调用并为您管理同步。 (您没有提到您正在使用的WebSphere Application Server版本。)

在WebSphere Application Server中,只要您使用相同的应用程序名称,模块URI和EJB名称,对bean的客户端引用将通过部署保持有效。如果您更改了其中任何一项(例如,因为您已在应用程序名称或模块URI中包含并更改了版本号),则需要在重新部署后刷新/重新启动客户端。您可以在远程调用周围添加try / catch(NoSuchObjectException)并添加逻辑以自动刷新。