Web流例外:找不到ID为'1'的流执行快照

时间:2014-06-19 07:02:55

标签: spring grails spring-webflow

每当我在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插件。

有人知道为什么会这样,以及如何解决这个问题?

3 个答案:

答案 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,如下所示:

https://docs.spring.io/spring-webflow/docs/2.4.4.RELEASE/reference/html/system-setup.html#tuning-flow-execution-repository

您可以在java配置代码上简单地写一下:

@Bean
public FlowExecutor flowExecutor() {
    return getFlowExecutorBuilder(flowRegistry())
            .setMaxFlowExecutions(5)
            .setMaxFlowExecutionSnapshots(30)
            .build();
}

如果要保留Snapshot版本的无限值,只需将maxFlorExecutionSnapshots设置为-1。