2

リモート サーバーへの EJB ルックアップを実行し、そのメソッドを実行するスタンドアロンの Javase クライアントを開発しました。サーバー アプリケーションは EJB 3.0 です。

いくつかの奇妙な魔法のようなまれな状況で、私のプログラムは無期限にハングします。問題の内部を見ると、サーバーで ejb を検索しているときに、サーバーからの応答が得られず、タイムアウトも発生しないようです。

クライアントまたはサーバー側でルックアップ時間を設定できるプロパティまたはその他の方法があるかどうかを知りたいです。

4

3 に答える 3

1

DeveloperWorksの ORB 構成のベスト プラクティスについて説明している非常に優れた記事がここにあります。クライアントで構成できる 3 つの異なる設定を引用しています (ルックアップを実行し、リモート サーバーでメソッドを実行している間)。

  • 接続タイムアウト: クライアント ORB がサーバーに要求を送信する前に、IIOP 接続を確立する (または既存の接続を再利用する) 必要があります。通常の状況では、IIOP および基礎となる TCP 接続操作は非常に高速に完了するはずです。ただし、ネットワーク上の競合または別の予期しない要因により、これが遅くなる可能性があります。デフォルトの接続タイムアウトは無期限ですが、ORB カスタム プロパティ com.ibm.CORBA.ConnectTimeout(秒単位) を使用してタイムアウトを変更できます。

  • Locate request timeout : 接続が確立され、クライアントがサーバーに RMI 要求を送信すると、LocateRequestTimeout を使用して、オブジェクトの CORBA LocateRequest (CORBA の「ping」) の時間を制限できます。その結果、LocateRequestTimeout は RequestTimeout 以下である必要があります。これは、送受信されるデータに関してははるかに短い操作であるためです。RequestTimeout と同様に、LocateRequestTimeout のデフォルトは 180 秒です。

  • リクエストのタイムアウト: クライアント ORB がサーバーへの TCP 接続を確立すると、リクエストが送信されます。ただし、無期限に応答を待機するわけではなく、デフォルトでは 180 秒間待機します。これは、ORB 要求のタイムアウト間隔です。これは通常、下げることができますが、サーバーからの予想されるアプリケーション応答時間と一致している必要があります。

于 2013-02-15T00:37:22.880 に答える
0

次のコードを試すことができます。これはタスクを実行し、指定された時間まで待機します。

Future<Object> future = executorService.submit(new Callable<Object>() {
public Object call() { 
return lookup(JNDI_URL); 
             }
         });

     try {
            Object result = future.get(20L, TimeUnit.SECONDS); //- Waiting for at most 20 sec
     } catch (ExecutionException ex) { 
       logger.log(LogLevel.ERROR,ex.getMessage());  
       return; 
    }

また、タスクは でキャンセルできますfuture.cancel(true)

于 2013-02-13T13:12:58.390 に答える