【问题标题】:Wicket And Multi-threaded Business ObjectWicket 和多线程业务对象
【发布时间】:2012-04-17 16:17:50
【问题描述】:

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

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

public Object getParentObject
{
   return this.parentObject;
}

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

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

当前的问题是 parentObject 和 childObjects 的 timertask 不再像应有的那样每分钟都被调用。我的日志记录了父对象的第一次启动,但日志消息永远不会再次输出,表明父对象的 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 类型的变量是。

【问题讨论】:

  • 嗯,你为什么从今天开始重新发布你的earlier question(稍作改动)?您可以编辑和改进原件,但请勿添加重复内容。
  • 问题其实完全相反。一个有太多线程的问题,现在我的线程由于某种原因被杀死了。我将在下面接受 artbristol 的建议,因为这似乎是最简单的解决方案,尽管我仍然对 Wicket 不喜欢有多线程的 POJ 感到困惑。
  • 哦,对不起;很难说几乎所有内容都是逐字复制的(实际上我花了一分钟的时间用眼睛“区分”它们)。一般来说,如果你链接到你的其他问题来提供上下文,然后非常清楚地解释什么是新的 i> 你问的问题。突出显示关键点(例如粗体)。不要在两个地方复制粘贴所有代码;只是相关/不同的部分(如果有的话)。
  • 啊,我明白了。我以后一定会这样做的!

标签: java multithreading timer wicket


【解决方案1】:

Wicket 基本上是单线程的(大多数优秀的 GUI 框架也是如此,因为很难正确处理多线程),您应该避免实例化任务。 (将 Timer 标记为瞬态将意味着它在反序列化时丢失,这可能是您的问题的原因)

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

【讨论】:

  • 是的,这就是我现在正在做的事情。我会报告它是否成功。谢谢你的建议。
  • 只有使用同一个页面实例是单线程的。使用两个或更多页面实例,或使用会话,或使用应用程序根本不是单线程的。所以要小心! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多