2016-12-29 64 views
2

當我收到我的API請求時,我想要執行一系列步驟,每個步驟都是檢查或充實。每一步都可能成功或失敗。在成功之後,下一步應該進行。失敗時,應執行結束步驟,並完成流程。爲此,我考慮過Spring State Machine,因爲它似乎符合法案。Spring State Machine - 我應該創建多少個?

我已經對文檔的閱讀起來與它發揮各地,但有些事情逃避我:

  1. 如果有一個請求和狀態機之間的1對1的關係,也就是說,對於每個請求,我創建一個新的狀態機實例?或者,我是否應該通過重新設置機器的下一個請求來重複使用已完成的狀態機?

  2. 清理完成狀態機怎麼樣?似乎沒有辦法銷燬和清理狀態機實例。如果我爲每個請求創建一個,我已經有效地引入了內存泄漏,除非框架以某種方式處理資源。

+0

我對Spring的實現並不熟悉,但查看文檔後發現,每臺機器都有其狀態的內部表示(與狀態存儲在機器外部相比; ala'State currentState = machine.start ()')。這會妨礙跨多個請求使用單臺機器,因爲第二個請求可能在第一個請求完成之前發生 - 可能會導致一些奇怪的行爲。 –

+0

就是這樣說的;狀態機是否必要?如果你只是檢查前提條件是否得到滿足,會簡單的'if(!firstSuccess)返回失敗;如果(!secondSuccess)返回失敗;'不夠? –

+0

我認爲有幾種設計可以支持這種流程。其中之一就是SSM。所以爲了嘗試它,我選擇了它。 我同意你的要求和狀態機實例之間必須有一對一的關係。但是這留下了資源控制的問題。實例是否應該被回收?還是應該丟棄?如果是這樣,怎麼樣? –

回答

2

對於你的問題沒有絕對正確的答案,所以我只需要在這裏留下一些評論。狀態機作爲一個概念非常鬆散,它給了你很多不同的方式來做事情。

  1. 整個概念,如果一個接一個的步驟有點涉及tasks配方如何實施。它執行一些任務,如果父任務失敗,機器進入錯誤狀態,給用戶一個修理東西並請求機器繼續的機會。 statemachine-recipes-tasksstatemachine-examples-tasks。可能是因爲這種用例很適合創建新配方,因爲它非常通用。
  2. 框架應該清除機器停止後的東西,最終jvm應該清除垃圾。如果您發現某些異常情況,請提交gh問題,我們會解決問題。
  3. 我們有樣品statemachine-examples-eventservice這是重新使用機器,但我正在重新實施該示例(它的工作原理,但應該更好地實施),正如我的主廚告訴我,我在那裏做的是轉儲SPR-15042。機器不能與session作用域一起使用,如果豐富對象(ssm是)被序列化,則事情將向南轉移。
  4. 做你的步驟流程的狀態和選擇的組合是相對容易的。這是唯一的問題,你想這可重複使用多少(因此通用配方將是一件好事,公關的歡迎:))
  5. 什麼來錯誤處理我在gh-240狀態圖中提出的東西也是需要考慮的事情。
  6. 如果ssm可以作爲一個更通用的流程引擎工作,但它可能是永遠不會成爲一個全新的項目的問題。認爲大部分流量可以作爲單獨的食譜來處理。