检票和多线程业务对象(Wicket And Multi-threaded Business Obje

2019-10-16 14:40发布

所以我有一个系列化,检票比较有限经验,以及多线程项目如此忍受我。

基本上我的web应用程序的类实例化一个POJ(parentObject),它创建了一个启动一个新的计时器和实例几个POJs(childObjects)也有他们的计时器。 这些childObjects存储在parentObject类的列表。 在我的检票应用程序页面需要访问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);
    }
}

我甚至需要使这些对象序列化? 这些对象本身永远都不会被连接到检票口的部件,尽管字符串,整数,这是他们班的成员日期各种各样的变量。

Answer 1:

检票基本上是单线程的(如最良好的GUI框架,由于越来越多线程权的难度),你应该避免初始化任务。 (标记定时器为瞬间将意味着它获取的方式反序列化时丢失了,这可能是你的问题的原因)

你应该重新构建您的应用程序具有通过Wicket组件访问的需求,可能使用LoadableDetachableModels服务层。 服务层可以有任务等,因为它会被Spring,而不是检票管理。



文章来源: Wicket And Multi-threaded Business Object