2012-04-17 18 views
1

私はシリアル化、Wicket、マルチスレッドプロジェクトの経験が限られています。Wicketとマルチスレッドのビジネスオブジェクト

基本的に、私のWebアプリケーションクラスは、aを作成するPOJ(parentObject)をインスタンス化して、新しいタイマーを開始し、タイマーも持つ複数のPOJ(childObjects)をインスタンス化します。これらのchildObjectは、parentObjectクラスのリストに格納されます。私の改札アプリケーションのページはparentObjectにアクセスする必要があるので、私はそれがアクセスできるように作られた:

public Object getParentObject 
{ 
    return this.parentObject; 
} 

そしてそうのように、各ページに取得されます。

((MyApplication)Application.get()).getParentObject() 

問題は現在、ということですTimerTaskを用parentObjectとchildObjectの両方が、毎分毎分呼び出されることはありません。私のログはparentObjectの最初の開始をピックアップしますが、ログメッセージは再び出力されません。これは、親オブジェクトのtimestaskのrun()メソッドが毎分実行されていないことを通知します。子オブジェクトについても同様です。タイマーは一度だけ実行されているようです。以下は、私が

public class childObject implements Serializable 
{ 
    private transient NamedParameterJdbcTemplate njt; 
    private transient Timer timer; 

    public childObject(DataSource ds) 
    { 
     this.njt = new NamedParamterJdbcTemplate(ds); 
    } 

    public void start() 
    { 
     timer = new Timer(); 

     timer.schedule(new TimerTask(){ 

      public void run() 
      { 
       //do some stuff that is never happening 
      } 

     }, 0, 60000); 
    } 
} 

public class ParentObject implements Serializable 
{ 
    private DataSource ds; 
    private List<ChildObject> childObjects; 
    private transient Timer; 

    public ParentObject(DataSource ds) 
    { 
     this.ds = ds; 
     //add some stuff to childObjects 

     timer = new Timer(); 

     timer.schedule(new TimerTask(){ 

      public void run() 
      { 
       for(some condition) 
       { 
        //Do some stuff 

        if(/*condition is met*/) 
        { 
          //starts the child's timer to do stuff 
         childObjects.get(i).start(); 
        } 
       } 
      } 

     }, 0, 60000); 
    } 
} 

public MyApplication extends WebApplication 
{ 
    private ParentObject object; 
    private DataSource ds; 

    public void init() 
    { 
     super.init(); 

     ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); 
     ds = (DataSource) context.getBean("dataSource"); 

     parentObject = new ParentObject(ds); 
    } 
} 

を持っている何のためにいくつかの擬似コードは、私もこれらのオブジェクトがシリアライズようにする必要がありますでしょうか?文字列、整数、その​​クラスのメンバである変数の日付の種類はありますが、オブジェクト自体はwicketコンポーネントには結び付けられません。

+1

ええ、なぜあなたはあなたの[以前の質問](http://stackoverflow.com/questions/10181865/wicket-application-serialization-and-java-timers)を今日から(マイナーチェンジで)再投稿しましたか?オリジナルを編集して改善することはできますが、重複は追加しないでください。 – Jonik

+0

質問は実際には全く反対です。 1つはスレッドが多すぎるという問題があり、何らかの理由でスレッドが強制終了されるようになりました。私はWicketが複数のスレッドを持つPOJを持っていないのはどうして私はまだ混乱していますが、artbristolのアドバイスをもっとも簡単な解決策のように見せています。 – thatidiotguy

+2

ああ、ご容赦ください。それはほぼすべてが逐語的にコピーされている時を伝えることは難しいです(そして、私は実際にそれらを目で「分けて」分を費やしました)。一般的に、この種の継続質問は、あなたが他の質問にリンクしてコンテキストを提供し、あなたが求めている*新しい*質問が何であるかを非常にはっきりと説明すればもっと良いでしょう。キーポイントを強調表示します(太字など)。両方の場所ですべてのコードをコピー&ペーストしないでください。ちょうど関連する/異なる部分(もしあれば)。 – Jonik

答えて

1

Wicketは基本的にシングルスレッドです(マルチスレッド化が困難なため、最も優れたGUIフレームワークです)、インスタンス化を避ける必要があります。 (タイマーを一時的なものとしてマークすると、途中で直列化が解除されると失われてしまいます。問題の原因になる可能性があります)

アプリケーションは、必要に応じてWicketコンポーネントによってアクセスされるサービスレイヤを持つように再設計する必要があります。 LoadableDetachableModelsを使用します。サービス層は、WicketではなくSpringによって管理されるため、タスクなどを持つことができます。

+0

ええ、それは私が今やっていることです。私はそれが成功したかどうかを報告します。アドバイスありがとう。 – thatidiotguy

+0

同じページインスタンスでのみ動作するのはシングルスレッドです。 2つ以上のページインスタンス、セッション、またはアプリケーションとの作業は、シングルスレッドではありません。だから注意してください! :-) –

+0

@ martin-gあなたはきちんとしていて、清算してくれてありがとう – artbristol

関連する問題