检票口和多线程业务对象

时间:2012-04-17 16:17:51

标签: java multithreading timer wicket

所以我对序列化,Wicket和多线程项目的经验有限,所以请耐心等待。

基本上我的Web应用程序类实例化一个POJ(parentObject),它创建一个启动一个新的计时器并实例化几个也有计时器的POJ(childObjects)。这些childObject存储在parentObject类的列表中。我的wicket应用程序中的页面需要访问parentObject,因此我可以访问它:

public Object getParentObject
{
   return this.parentObject;
}

并在每个页面中检索它,如下所示:

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

目前的问题是,不再需要每分钟调用parentObject和childObjects的timertask。我的日志获取了parentObject的第一个开始,但是再也没有输出日志消息,表明父对象的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);
    }
}

我是否甚至需要将这些对象设置为Serializable?对象本身永远不会附加到wicket组件,尽管String,integer,Date类变量是它们类的成员。

1 个答案:

答案 0 :(得分:1)

Wicket基本上是单线程的(由于很难获得正确的多线程,因此最好的GUI框架)并且您应该避免实例化任务。 (将定时器标记为瞬态意味着它会在反序列化时丢失,这可能是导致问题的原因)

您应该重新构建您的应用程序,以便拥有一个服务层,该服务层可以按需使用Wicket组件,可能使用LoadableDetachableModels。服务层可以有任务等,因为它将由Spring而不是Wicket管理。