0

server私のWebアプリでは、クライアントは同時に両方clientです。ピア ツー ピア アプリケーションと同様に、クライアントが Web アプリケーションを開始した後、最初に行われることは次のとおりです。インターネット接続が利用可能かどうかを確認します(jsp ページが読み込まれるため)。接続が利用可能な場合、ノード情報がリモート データベースに送信されます。これは、メイン サーバーに接続されているノードのアドレスを知るためのものです。

ここで、ノードがサーバーから切断された場合(インターネット接続の障害などにより)、ノードの情報をデータベースから削除したいと考えています。

これを実装する 1 つの方法は、データベース内のすべてのノードへの接続を試行し続けるメイン サーバーでスレッドを開始することです。しかし、私はこのオプションに満足していません。別の方法があるかもしれません。または、これをより良い方法で実装できるかもしれません。

どうすればいいですか?

そして、メイン サーバーでスレッドを開始する必要があります。jsp ページからスレッド関数を呼び出しますか? お気に入り :

<%-- This is a jsp page --%>
.....
........
<%-- start a new thread that does that task --%>

<% new ThreadClass().startContinuousThread(); %>
......
.........

注:各ノードは次のように中央サーバーに接続します。

      final URL url = new URL("http://sevrer/servlet");
      final HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
      int responseCode = urlc.getResponseCode();
      if(responseCode == 200){
          connected = true;
          System.out.println("Initial connection to the server successful");
      }

      // send the node information to the servlet via a 'parameterized query'.
4

1 に答える 1

1

サーバー側でこのチェックを行う代わりに、クライアント送信でこのチェックを行うことをお勧めします。構成された時間間隔で ping 要求を送信するようなものです。サーバーに接続するコードと同様に、別のサーブレットを定期的に呼び出すコードを記述します。

final URL url = new URL("http://sevrer/pingServlet");
final HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
int responseCode = urlc.getResponseCode();

サーバーは、サーバー内の各ノード エントリに到着した最後の ping 要求を単純にチェックするタイマー タスクを保持します。いずれかのノードの ping エントリが構成されたタイムアウト間隔内に到着しなかった場合、サーバーはデータベースからノードをクリーンアップします。

このソリューションの利点は、毎回リクエストを開始することでサーバーが過負荷にならないことです。ただし、I/O 側での改善は見られませんが、このソリューションではサーバー側のロジックが非常にクリーンでシンプルになります。

于 2012-12-10T11:53:12.570 に答える