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)))