1

少し古いアプリケーションでBizDelegateServiceLocator、クライアント側のパターンとして使用されます。なぜかBizDelegateキャッシュされていました。つまり、ホームおよびリモート インターフェイスがキャッシュされ、約 100 のスレッド間で共有されます。のメソッドBizDelegateも同期されません。

いくつかの問題があります。

  1. ソケットへの書き込み中にクライアント側でスレッドの問題が発生しましたか?(単一のオブジェクトがスレッド間で共有されようとしているため)
  2. 展開を行うときは、常にクライアントを再起動する必要がありますか? (リモート インターフェイスが保存され、展開が別の参照を作成するため)。サーバー側には、サーバー EJB プール サイズ 500 の ejb オブジェクト インスタンスがあります。

で作成された EJB インスタンスを 1 つだけ使用するということ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 に答える