2011-11-15 12 views
0

私はVaadinアプリケーションを持っていますが、アプリケーションの2つのインスタンスを同時に実行すると(1つはFF、もう1つはIEで)、奇妙な動作をしています。私は既に大部分の静的オブジェクトを削除しています(これにより、開いている別のアプリケーションと並行してアプリケーションをリロードするとアプリケーションが完全にリロードされました)。しかし、私は現在、両方のインターフェースで1つのユーザーのデータしか得られていないことに気づいています。これは、私がデータキャッシングとSOAP接続を管理するために使用しているシングルトンオブジェクトによって引き起こされたと仮定しています。私はそれが奇妙な出力を引き起こしているシングルトンのパターン自体であるかどうか知りたいのですか、それともちょうど私が保っている静的インスタンスオブジェクトですか?vaadinアプリケーションインスタンスを互いに干渉させないようにするにはどうすればいいですか?

私はシングルトンでThreadLocalを使用しようとしましたが、シングルトンの機能でそれらを使用しようとすると、すべての変数が常にnullになります。現在、私のシングルトンにはこれが含まれています。恐らくそれはうまくいかず、ひどく間違っています。

private static ThreadLocal<SoapClient> instance = new ThreadLocal<SoapClient>(); 

public static synchronized SoapClient getInstance(){ 
    if (instance.get() == null) { 
     instance.set(new SoapClient()); 
    } 
    return instance.get(); 
} 

私はいつも私のアプリケーションインスタンスの至る所にキャッシュされたデータにアクセスし、自分のユーザーのSOAP接続を持っているだろう、と私はそれを行うために考えることができる唯一の他の方法を持っていることですので、私はシングルトンオブジェクトを選択しました静的なオブジェクトはどこかにありますが、静的なキーワードが最初のすべての私の問題の原因であるようです。これを回避する方法はありますか、それを引き起こす何か他のものがありますか?ローカルあなたのスレッドをインスタンス化する

答えて

4

良い方法は、この

ThreadLocal<SoapClient> instance = new ThreadLocal<String>() { 
    @Override 
    protected String initialValue() { 
    return new SoapClient();  
    } 
} 

だろうしかし、あなたの問題は、ここでは、Webアプリケーションサーバ「プール」と再利用のスレッドです。あなたのSoapClientがAppインスタンス1に適切な情報をキャッシュすると、App 2のUIは、 「アプリ固有の」情報のSoapClientにキャッシュされていることを(あなたの説明から)と仮定すると、アプリの1

ためのSoapClientは、私はあなたが

  • 作成することを示唆していると、あなたのApplicationオブジェクト上のSoapClientを格納します通常のフィールド(静的ではなく、スレッドローカルではない)

  • (SoapClientを取得するために)アプリケーションにアクセスする必要があります。また、あなたの所在地からの操作が難しい場合は、ThreadLocal access patternを使用してください。リンクの2番目の例を参照してください。 ThreadLocalはHttpRequestの先頭に設定され、最後に「unset」が設定され、同じスレッド上の後続の要求が同じアプリケーションインスタンスを取得しないことに注意してください。

+0

完全に動作します、ありがとうございます! – Valyrion

関連する問題