1

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

我们有几个问题。

  1. 写入套接字时客户端的线程问题?(因为单个对象试图在线程之间共享)
  2. 当你进行部署时,总是需要重新启动客户端?(由于存储了远程接口和部署不同的参考)。我们在服务器端确实有服务器 EJB 池大小 500 ejb 对象实例。

这是否意味着我们只使用一个在 while 中创建的 EJB 实例home.create()?它是一种单身人士吗?我们使用 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)
4

1 回答 1

0

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

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

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

于 2013-07-08T17:44:46.373 回答