私はシリアル化、Wicket、マルチスレッドプロジェクトの経験が限られていますので、私には負担がかかります。Wicketアプリケーション、シリアライゼーション、Javaタイマー
本質的に私のWebアプリケーションクラスは、aを作成するPOJ(parentObject)をインスタンス化して、新しいタイマーを開始し、タイマーも持つ複数のchildObjectsをインスタンス化します。これらのchildObjectは、parentObjectクラスのリストに格納されます。私の改札アプリケーションのページはparentObjectにアクセスする必要があるので、私はそれがアクセスできるように作られた:
public Object getParentObject
{
return this.parentObject;
}
そしてそうのように、各ページに取得されます。
((MyApplication)Application.get()).getParentObject()
問題は現在、ということですTimerTaskを用parentObjectとchildObjectの両方が、毎分毎分呼び出されることはありません。私のログはparentObjectの最初の開始をピックアップしますが、ログメッセージは再び出力されません。これは、親オブジェクトのtimestaskのrun()メソッドが毎分実行されていないことを通知します。
編集:それはより多くの問題が、私はあなたがParentObjectへの参照を結合するのではなく、あなたのコンポーネントに直接ごParentObjectをバインド把握あなたの問題の説明が与えられ
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*/)
{
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);
}
}
WicketApplicationはシングルトンであり、ページまたはセッションとしてシリアル化されません。 – bert
コメントありがとうございます。私はそれを理解していますが、私のタイマーはまだ意図したとおりに動作していません。状況を表示するために擬似コードを追加しました。 – thatidiotguy