fitter
1.0.0
系統組件管理庫,用於Clojure。
類似的目的庫:
最小組件只是其他組件實例的“映射”功能,並返回此組件實例。系統“映射”僅支持ILookup接口,請參見系統測試。所有查找都實例化了請求的組件,並動態地在組件之間形成依賴性。 (!)所有組件都通過系統關鍵名稱緊密結合在一起。
完整的組件定義其開始,停止和暫停行為。
( ns readme.component
( :require [strojure.fitter.component :as component]))
( def function-component
" Simple function describes component start behaviour. "
( fn [{ :keys [another-component]}]
( comment " Use " another-component)
:instance ))
( def constant-component
" Just constant component. "
( constantly true ))
( def map-component
" Component described as hash map with required `::component/start` key. "
{ ::component/start ( constantly :instance )
::component/stop! ( fn stop! [instance]
( comment " Destroy " instance))
::component/suspend! ( fn suspend! [old-instance old-system]
( comment " Suspend " old-instance old-system)
( fn resume [new-system]
( comment " Resume " old-instance new-system)
:instance ))})
( def assembled-component
" Same map as above created using `component/of`. "
( component/of ( constantly :instance )
( fn stop! [instance]
( comment " Destroy " instance))
( fn suspend! [old-instance old-system]
( comment " Suspend " old-instance old-system)
( fn resume [new-system]
( comment " Resume " old-instance new-system)
:instance ))))系統狀態是運行組件的變量保存實例。該狀態是通過init初始化的,然後通過start!然後stop! 。
( ns readme.system-state
( :require [strojure.fitter.system :as system]))
( def ^:private registry
{ ::a ( constantly ::a )
::b ( fn [{ ::keys [a]}] { ::b a})})
; ; Initialize system state.
( defonce ^:private system!
( system/init { :registry registry}))
; ; Start all system keys.
( system/start! system!)
; ; Stop all running keys.
( system/stop! system!)
; ; The `start!`, `stop!` and `deref` return the actual system map.
( let [{ ::keys [a b]} ( system/start! system!)]
( comment " Work with " a b))
( let [_ ( system/start! system!)
{ ::keys [a b]} ( deref system!)]
( comment " Work with " a b))
; ; Start/stop only specific keys.
( system/start! system! { :filter-keys #{ ::a }})
( system/stop! system! { :filter-keys #{ ::a }})
; ; Start/stop system incrementally.
( doto system! ( system/start! { :filter-keys #{ :a }})
( system/start! { :filter-keys ( complement #{ :a })}))
( doto system! ( system/stop! { :filter-keys ( complement #{ :a })})
( system/stop! { :filter-keys #{ :a }}))
; ; Update registry on start.
( system/start! system! { :registry ( assoc registry ::c ( constantly ::c ))})
; ; Suspend suspendable components on stop and resume them on start.
( doto system! ( system/stop! { :suspend true })
( system/start! ))
; ; Execute components in parallel
( doto ( system/init { :parallel true }) ( system/start! )
( system/stop! ))
( system/start! system! { :parallel true })
( system/stop! system! { :parallel true })
; ; Use `with-open` to stop system automatically.
( with-open [s! ( system/init { :registry registry})]
( let [{ ::keys [a b]} ( system/start! s!)]
( comment " Work with " a b)))