每当我在web-flow中将一个状态切换到另一个状态超过15次时,我就会遇到异常。
No flow execution snapshot could be found with id '1'; perhaps the snapshot has been removed? . Stacktrace follows:
org.springframework.webflow.execution.repository.FlowExecutionRestorationFailureException: A problem occurred restoring the flow execution with key 'e7s1'
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.webflow.execution.repository.snapshot.SnapshotNotFoundException: No flow execution snapshot could be found with id '1'; perhaps the snapshot has been removed?
... 3 more
我正在使用grails webflow插件。
有人知道为什么会这样,以及如何解决这个问题?
答案 0 :(得分:8)
Web Flow一次仅在其存储库中保留指定数量的Executions(“e7”)和Snapshots(“s1”)。这对于限制可以消耗多少内存很有用。我猜测默认值是15,在这种情况下,当你从一个状态移动到状态时,执行“e7”可以有15个快照。一旦你点击“e7s16”,“s1”将被丢弃,从而为你提供你所看到的结果。
您可以使用<webflow:flow-execution-repository>
配置元素change the defaults:
<!-- Executes flows: the entry point into the Spring Web Flow system -->
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
<webflow:flow-execution-repository max-execution-snapshots="20" max-executions="2"/>
</webflow:flow-executor>
引用上面的链接:
调整max-execution-snapshots属性以对历史记录数设置上限 每个流程执行可以获取的快照。要禁用 快照,将此值设置为0.启用无限数量的 快照,将此值设置为-1。
我确实发现默认行为是不可接受的,但是,当您碰巧访问过期的快照时,您只会遇到异常。 Another recent question询问如何抓住这个案子,大概是这样你可以在事件发生时做更有用的事情。
(我们实现了自定义代码,以便在HttpSession中携带最后一个有效的快照,以便我们可以在发生异常时将用户发送到那里。)
答案 1 :(得分:1)
感谢您的帮助。但我正在使用grails应用程序。我使用以下代码修复了它。
DefaultFlowExecutionRepository defaultFlowExecutionRepository=(DefaultFlowExecutionRepository)Holders.applicationContext.getBean('flowExecutionRepository');
defaultFlowExecutionRepository.setMaxSnapshots(100)
答案 2 :(得分:0)
对于较新版本的SpringWebflow,如下所示:
您可以在java配置代码上简单地写一下:
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(flowRegistry())
.setMaxFlowExecutions(5)
.setMaxFlowExecutionSnapshots(30)
.build();
}
如果要保留Snapshot版本的无限值,只需将maxFlorExecutionSnapshots设置为-1。