从wicket使用工作线程时如何处理序列化?

时间:2012-03-28 15:38:13

标签: multithreading serialization wicket

在我们的wicket应用程序中,我需要启动一个长时间运行的操作。它将与外部设备通信,并在一段时间(最多几分钟)后提供结果。

Java-wise长时间运行的操作是由我可以提供回调的方法启动的。

  public interface LegacyThingy {
       void startLegacyWork(WorkFinished callback);
  }

  public interface WorkFinished {
       public void success(Whatever ...);
       // failure never happens
  }

在我的Wicket页面上,我计划添加一个Ajax按钮来调用startLegacyWork(...),提供适当的回调。对于结果,我将显示一个面板,该面板使用AbstractTimerBehavior轮询结果。

令我难以理解的是以下问题:

要保持状态Wicket将组件树与数据一起序列化,因此数据需要包装在可序列化模型(或可拆卸模型)中。

因此,为了保持结果面板和WorkFinished回调之间的“连接”,我需要一些方法来创建Wicket的“我们序列化一切”世界和“嘿我是Java对象”之间的链接管理我的一生“传统界面的世界。

当然,我可以将正在进行的操作存储在一种全局地图中,并使用Wicket可拆卸模型,通过id查找它们......但是感觉很脏,我不认为这是正确的方法。 (它开启了一整套关于此类事物生命的蠕虫)。

或者我正在研究如何从检票口进行长时间运行的完全错误的角度?

1 个答案:

答案 0 :(得分:2)

我认为全球地图的方法很好。 Wicket也在内部使用类似的东西 - org.apache.wicket.protocol.http.StoredResponsesMap。这是一个特殊的地图,用于保留REDIRECT_TO_BUFFER策略的生成响应。它具有将条目保留至多一些预先配置的持续时间的逻辑,并且还可以具有条目的上限。