如何在使用wicket的工作线程时处理序列化



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

在Java方面,长时间运行的操作是由一个我可以提供回调的方法启动的。

  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查找它们。。。但这感觉很脏,我认为这不是正确的方式。(它打开了一整罐关于这些事情一生的蠕虫)。

或者我从一个完全错误的角度看待如何从三柱门进行长距离操作?

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