在使用component库时遇到了以下问题 - 只要给定组件依赖于另一个组件,系统映射中的关联依赖关系就不会释放它的资源(即未停止) '停止系统'
我认为两个生命周期方法都在依赖顺序中工作,并在依赖图的树遍历中为每个组件及其依赖项调用start / stop。
我还没详细看过,但我做了一个简单的应用程序,通过简单的单元测试(call lein test
)重现问题:
答案 0 :(得分:2)
您的测试失败的原因是您从:message-handlers
检索数据库依赖项,而不是直接从数据库依赖项中检索数据库依赖项。正如您自己指出的那样,数据库的stop
函数被正确调用,因此资源将被释放(在现实生活中)。
但是,消息处理程序的数据库依赖关系仍然引用旧数据库。由于不变性的性质,这与stop
函数的结果不同。
如果您要编写这样的测试,它会起作用:
(is (nil? (-> the-system
system/start
system/stop
:database
:connection)))
此验证按预期成功。
我希望这能回答你的问题吗?
答案 1 :(得分:0)
FWIW,如果您将printlns
添加到开始和停止方法,您会看到:
在system/start
:
db start
message handler start
在system/stop
:
message handler stop
db stop
我不知道为什么消息处理程序中的数据库引用没有更新。