2

私がやっていることは、最初のページに到達しようとしているだけです。そして、私は次の例外を受け取ります:

org.springframework.webflow.execution.repository.snapshot.SnapshotNotFoundException: 
No flow execution snapshot could be found with id '1'; perhaps the snapshot has been removed? 

私は以下を使用しています:

  • Spring Webflow 2.3 (persistence-context フラグ付き)
  • 春のセキュリティ
  • 春のMVC
  • 春のデータ
  • JPA 2.0、カスタム JpaFlowExecutionListener を使用/経由

私の JpaFlowExecutionListener の唯一のカスタム部分は、フローをシリアル化できるようにスコープから EntityManager を切り離す部分です。フローはデータベースに保存/読み取りされます。しかし、最初のビューをレンダリングすることはできません。

ここからわかることは、以下にクラッシュする前に通過する手順です。

  1. FlowExecutorImpl コードは launchExecution() を呼び出します。
  2. PersistentConversation が作成されます。
  3. PersistentConversation スレッドがロックされました
  4. PersistentConversation は executionRepository と、会話の PersistentConversationHolder の ThreadLocal マップに配置されます。(アクティブなスレッドの会話のリストを保持します)
  5. ロックを解除 - ThreadLocal マップの PersistentConversation を削除します
  6. 次に FlowExecutorImpl createPausedResult(flowExecution) を呼び出します
  7. 最終的に FlowExecutorImpl resumeExecution() を呼び出します。
  8. FlowID を使用して PersistenceConversationHolder マップで PersistentConversation を検索しますが、ここでは PersistentConversation が見つかりません。
  9. データベースから取得し、db オブジェクトを新しい PersistentConversation に詰め込みます。
  10. スナップショット リストから会話を再開しようとしましたが、手順 5 で削除されました。

PersistenceConversationHolder については、この本のこちらの例を参照してください。

どんな助けでも大歓迎です!

4

1 に答える 1

2

私のように誰かがこれを逃した場合に備えて...

上記のステップ 5 で、スレッドのロックが解除されたら、PersistentConversation をデータベースに保存/更新する必要があります。このコピーには、すべてのスナップショット情報が含まれます。

これを書いたら、抜けているステップがあることが簡単にわかりました。

于 2013-11-06T16:19:37.907 に答える