组件不会停止嵌套依赖项

时间:2017-06-05 19:22:28

标签: clojure components

在使用component库时遇到了以下问题 - 只要给定组件依赖于另一个组件,系统映射中的关联依赖关系就不会释放它的资源(即未停止) '停止系统'

我认为两个生命周期方法都在依赖顺序中工作,并在依赖图的树遍历中为每个组件及其依赖项调用start / stop。

我还没详细看过,但我做了一个简单的应用程序,通过简单的单元测试(call lein test)重现问题:

https://github.com/fbielejec/component-app

2 个答案:

答案 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

我不知道为什么消息处理程序中的数据库引用没有更新。