1

そのため、シリアル化、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の種類の変数はアタッチされます。

4

1 に答える 1

1

Wicketは基本的にシングルスレッドであり(マルチスレッドを正しく取得するのが難しいため、最も優れたGUIフレームワークと同様)、タスクのインスタンス化は避ける必要があります。(タイマーを一時的なものとしてマークすると、逆シリアル化の際にタイマーが失われることを意味します。これが問題の原因である可能性があります)

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

于 2012-04-17T17:20:04.890 に答える