2012-03-28 1 views
2

私たちのウィケットアプリケーションでは、長時間の操作を開始する必要があります。外部デバイスと通信し、しばらくすると(数分後に)結果を提供します。wicketからワーカースレッドを使用するときのシリアル化を処理する方法は?

私はコールバックを提供することができる方法でJavaの長期実行操作が開始されます。私のWicketのページ上

public interface LegacyThingy { 
     void startLegacyWork(WorkFinished callback); 
    } 

    public interface WorkFinished { 
     public void success(Whatever ...); 
     // failure never happens 
    } 

私はstartLegacyWork(...)が適切なコールバックを提供する呼び出すためのAjaxボタンを追加する予定。結果として、AbstractTimerBehaviorを使用して結果をポーリングするパネルを表示します。私の心は、次のような問題であるboggles何

状態ウィケットを保つためには、このようにデータが直列化モデル(または着脱式のモデル)に包まれる必要がある、データとともにコンポーネントツリーをシリアライズします。

結果パネルとWorkFinishedコールバックの間の "接続"を維持するために、私たちはWicketの "私たちはすべてをシリアル化する"世界と "こんにちは私はJava Objectです。誰も私の生涯 "従来のインターフェースの世界を管理していません。

もちろん、グローバルマップの中に進行中の操作を保存し、IDでそれらを見ているWicketの取り外し可能なモデルを使用することもできます...しかし、それは汚れていると私は正しい方法だとは思いません。 (それは、そのようなものの生涯に関するワームの全体を開く)。

または、私はウィケットから長時間の運転操作を行う方法について完全に間違った角度を見ていますか?

答えて

2

グローバルマップのアプローチが良いと思います。 Wicketは内部的にも同様のものを使用します - org.apache.wicket.protocol.http.StoredResponsesMap。これは、REDIRECT_TO_BUFFER戦略のために生成された応答を保持する特別なマップです。これには、あらかじめ設定された期間を超えないようにエントリを保持するロジックがあり、エントリの上限も持つことができます。

+0

保存されたレスポンスマップを見るWicketのMostRecentlyUsedMapが見つかりました。私は自分自身を実装したくない問題(寿命、最大カウント)を少なくとも処理しています。 現在、私は別の方法で問題を回避しようとしています(低レベルのインターフェイスは、私にいくつかのシリアライズ可能なIDを提供するので、レガシーシステムへの低レベルのインターフェイスを使用しています)。 – froh42

関連する問題