![]() |
![]() |
|
|
| |
スレッディング
Java から COM へ
WebLogic jCOM は、Java から COM オブジェクトへの複数の同時要求を処理します。
WebLogic jCOM ランタイム DCOM エンジンを使用すると、複数の同時要求を同じ COM オブジェクト、および異なる COM オブジェクトに対して行うことができます。また、WebLogic jCOM は DCOM と対話し、DCOM は DCE RPC の上層にあるので、WebLogic jCOM は大規模なメソッド呼び出しを複数の RPC PDU に分割し、分割された応答を再び結合します。
リモート COM オブジェクトが複数の同時要求を適切に処理するかどうかは、すべてそのスレッディング モデルと実装によって決まります。
COM から Java へ
WebLogic jCOM は、COM オブジェクトからの要求を処理するためにスレッドのプールを保持します。デフォルトでは、WebLogic jCOM は最大 20 のスレッドで要求を処理しますが、次のように、JCOM_MAX_REQUEST_HANDLERS プロパティを自由に設定することで、最大スレッド数を変更できます。
java -DJCOM_MAX_REQUEST_HANDLERS=50 YourMainProgram
WebLogic jCOM は、必要に応じてこうしたスレッドを作成します。つまり、初めから 20 のスレッドが即座に作成されるわけではありません。最初のスレッドは、最初のリモート要求が届いたときに作成されます。2 番目の要求が届き、最初のスレッドが要求を処理している場合、WebLogic jCOM は 2 番目のスレッドを作成して 2 番目の要求を処理します。このようにして、最大 20 のスレッド(デフォルト)が作成されます。
WebLogic jCOM のスレッド割り当てメカニズムを確認したい場合、内部ロギングを有効に(JCOM_LOG_LEVEL プロパティを最大値の 3 に設定)して WebLogic jCOM を実行します。次の Visual BASIC コードでは、Java オブジェクトへのコールバックが行われます(p1 は Java オブジェクト)。
Public Sub
method1(ByVal p1 As Object)
p1.aMethod
End Sub
以下は、何が起こったかを示すログの抜粋です。IDispatch::GetIDsOfNames は、リフレクションによって WebLogic jCOM で内部的に処理されます。
13:05:20+: ObjectExporter0 received an unfragmented request with call ID 1
13:05:20+: Maximum number of request handler threads is set to 20
13:05:20+: There are 0 request handler threads, of which 0 are currently busy.
13:05:20+: Creating a new request handler thread.
13:05:20 : IDispatch::GetIDsOfNames request on ExcepDemo@1f230b for AMETHOD. Returning memid 9
13:05:20+: ObjectExporter0 sending 44 bytes
13:05:20+: ObjectExporter0 read 192 bytes
13:05:20+: ObjectExporter0 received an unfragmented request with call ID 2
13:05:20+: There are 1 request handler threads, of which 0 are currently busy.
13:05:20 : IDispatch::Invoke request received for public void ExcepDemo.aMethod() on ExcepDemo@1f230b
Java オブジェクト内の同じメソッドが COM オブジェクトによって同時に複数呼び出されないようにする場合は、標準 Java synchronized キーワードを使用します。これにより、別のオブジェクトが既にメソッドを呼び出している場合、同じメソッドの呼び出しがブロックされます。
![]() |
![]() |
![]() |