2

Web Flow 2.0.0プラグイン(基本的にSpring Web Flow 2.0.8.RELEASE)を使用しているGrailsアプリケーションで奇妙な動作に直面しました。Webフローを実行しているユーザーによって発生するLockTimeoutExceptionを受け取ることがあります。これにより、通常、サーバーがダウンします。

Spring Web Flowについて詳しく読んだ後、問題は長時間実行されるタスクにある可能性があることに気付きました(Thread.sleep(30000)でこれをテストしました)。最初の計算に時間がかかる場合(デフォルトでは30秒以上)にユーザーが[次へ]ボタンを2回クリックすると、2番目の要求を満たすことができず(フローをロックできない)、この例外がスローされます。

この動作は、計算にかかる時間が短い(たとえば、5秒)ときに次のボタンを「クレイジー」にクリックすることでも実現できます。十分な数のクリックの後、最新のリクエスト/スレッドは30秒以上待機する必要があるため、失敗します。(私たちの計算には非常に短い時間がかかるはずなので、これは本番環境の場合だと思います。狂ったようにクリックしている入院患者のユーザーを想像してみてください:-)

私の質問は:

この問題を解決するための標準的な方法はありますか?

  • たとえば、最初のリクエストが終了しなかった場合、どういうわけか2番目のリクエストを破棄するようなものですか?-これはデッドロックにつながる可能性がありますか?
  • または、最初のクリック後に「次へ」ボタンを無効にしますか?
  • ロックタイムアウト期間を長くすると、この問題が延期されると思います...

サーバーがダウンするのを防ぐ方法はありますか?

  • ローカルで(Thread.sleep()を使用して)テストしたところ、本番環境ではダウンしませんでした。

この質問は、Grails Webフローユーザーだけでなく、SpringWebフローユーザーにも関係があると思います...

アドバイスありがとうございます、マテオ

4

1 に答える 1

2

最初のクリック後に[次へ]ボタンを無効にすることをお勧めします。他の解決策(LockTimeoutを増やすなど、その問題をより長い時間延期します(たとえば、30秒ではなく60秒など)。[次へ]を無効にすることは完璧な解決策です(ただし、これは単なる回避策であり、サーバー側の実際の解決策ではありません)。

于 2013-01-05T15:01:51.653 に答える