2

Javaで小さなHTTPサーバーを作成しましたが、静的変数(サーバー構成:ポート、ルートなど)を要求を処理するスレッドに渡す際に問題が発生します。スレッドにこれらの変数を変更させたくありません。サーバークラスを拡張すると、不要なメソッドも継承されます。

パフォーマンス上の理由からゲッターは使いたくありません。静的メンバーをfinalにすると、構成ファイルから値をロードするときに問題が発生します。

これが例です

class HTTPServer {
static int port; 
static File root;
etc..
....
//must be public
public void launch() throws HTTPServerException {
    loadConfig();
    while (!pool.isShutdown()) {
            ....
        //using some config here
             ...
        try {
    Socket s = ss.accept();
    Worker w = new Worker(s);
    pool.execute(w);
        }catch () {...}
    }
}
private void loadConfig(){ //reading from file};
...
other methods that must be public goes here
}

また、ワーカーをネストされたクラスにしたくありません。別のパッケージに入っています...

何を提案しますか?

4

2 に答える 2

2

設定を最終的なAtomicReferenceに入れることができます。次に、ワーカーが参照したり、スレッドセーフな方法で更新したりできます。

何かのようなもの:

class HTTPServer {
  public static final AtomicReference<ServerConf> config = 
    new AtomicReference(new ServerConf());
}

新しいServerConfクラスを不変にします。

class ServerConf {
  final int port;
  final File root;
  public ServerConf(int port, File root) {
    this.port = port;
    this.root = root;
  } 
}

次に、ワーカーはを介して現在の構成への参照を取得できますHTTPServer.config.get()。おそらく次のようなものです:

Worker w = new Worker(s, HTTPServer.config.get());

loadConfig()次のような方法で新しい構成を設定できます。

HTTPServer.config.set(new ServerConf(8080, new File("/foo/bar"));

すべての構成を同時に変更することが重要でない場合は、ServerConfクラスをスキップしAtomicIntegerて、ポート設定とAtomicReference<File>ルートに使用できます。

于 2012-04-18T21:37:49.200 に答える
0

静的データを、ソケットフィールドも持つ静的な「sharedConfig」オブジェクトに読み込みます。このフィールドをリスニングソケットに使用できます。acccpet()がserver <>クライアントソケットで戻ってきたら、clone()'sharedConfig'を実行し、新しいソケットに押し込み、そのオブジェクトをserver<>クライアントワーカースレッドに渡します。次に、スレッドは構成のコピーを取得します。このコピーは、他のスレッドや静的構成に影響を与えることなく、消去したり、必要に応じて変更したりすることができます。

于 2012-04-18T21:37:30.827 に答える