在我们的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查找它们......但是感觉很脏,我不认为这是正确的方法。 (它开启了一整套关于此类事物生命的蠕虫)。
或者我正在研究如何从检票口进行长时间运行的完全错误的角度?
答案 0 :(得分:2)
我认为全球地图的方法很好。 Wicket也在内部使用类似的东西 - org.apache.wicket.protocol.http.StoredResponsesMap。这是一个特殊的地图,用于保留REDIRECT_TO_BUFFER策略的生成响应。它具有将条目保留至多一些预先配置的持续时间的逻辑,并且还可以具有条目的上限。