所以我对序列化,Wicket和多线程项目的经验有限,所以请耐心等待。
基本上我的Web应用程序类是实例化一个POJ(parentObject),它创建一个启动一个新的计时器并实例化几个也有计时器的子对象。这些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*/)
{
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);
}
}
答案 0 :(得分:3)
鉴于您的问题描述,我想您将ParentObject直接绑定到组件,而不是绑定对ParentObject的引用。会话范围对象(实际上是所有页面,组件和模型)的序列化/反序列化会创建这些“新”实例(即使它们是原始父对象的反序列化副本)。
虽然你没有显示太多代码,但我怀疑你做了类似的事情:
public MyPage() {
Object parentObject = ((MyApplication)Application.get()).getParentObject();
add(new Label("timer", new PropertyModel(parentObject, "time")));
}
这会将父对象绑定到属性模型,并将父对象绑定到页面(通过标签组件)。你应该做的是:
public MyPage() {
add(new Label("timer", new PropertyModel(this, "application.parentObject.time")));
}
这会将页面绑定到自身,并指示属性模型动态地检索应用程序,并从应用程序中检索父对象,以及时间。这样,您就不会将对象绑定到页面层次结构,而是动态检索它们。
另一种选择是使用LoadableDetachableModel从应用程序中检索父对象,并在呈现页面后将其分离。
public class ParentObjectModel extends LoadableDetachableModel<ParentObject> {
@Override public ParentObject load() {
return ((MyApplication)Application.get()).getParentObject();
}
}