そのため、シリアル化、Wicket、およびマルチスレッドプロジェクトの経験はやや限られているので、我慢してください。
基本的に、私のWebアプリケーションクラスはPOJ(parentObject)をインスタンス化しています。これにより、新しいタイマーが開始され、タイマーが含まれる複数のPOJ(childObjects)がインスタンス化されます。これらのchildObjectは、parentObjectクラスのリストに格納されます。ウィケットアプリケーションのページはparentObjectにアクセスする必要があるため、次のようにアクセスできるようにしました。
public Object getParentObject
{
return this.parentObject;
}
そしてそれは次のように各ページで取得されます:
((MyApplication)Application.get()).getParentObject()
現在の問題は、parentObjectとchildObjectsの両方のtimertaskが、本来あるべき分ごとに呼び出されなくなっていることです。私のログはparentObjectの最初の開始を取得しますが、親Objectのtimertaskの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);
}
}
これらのオブジェクトをシリアル化可能にする必要がありますか?オブジェクト自体がウィケットコンポーネントにアタッチされることはありませんが、クラスのメンバーであるString、integer、Dateの種類の変数はアタッチされます。