Auto-close the Closers
Managing the resource lifecycle (Peripherals)
介绍
在应用程序终止时,也即当子命令的 OnAction
结束返回之后,cmdr 将会调用 OnPostAction 回调,然后结束 App 对象的生命周期,在最后 cmdr 也会通过依次调用所有的 Close()
来关闭所有 Closers。
Closers
是一个全局的对象数组,这里登记注册了一切你想要自动关闭的资源型对象。
例如一个数据库连接对象,你可以通过实现 Peripheral
接口 Close()
并将该对象登记到 Closers
中,然后则无需关心相关资源的回收问题了。
当然,实际上回收任务将在 Close()
中被调用,而调用的时机就在 cmdr 快要结束运行之前。
下面的代码展示了如何管理资源型对象:
作为资源型对象的 dbConn 实例,由于它实现了 Open(context.Context) error
(即 basics.Openable
,参见 hedzr/is.basics
),因此 cmdr.WithPeripherals()
完成两件事:
- 将其登记到
is.Closers()
之中,实现自动释放资源和关闭对象 - 将其登记到 pre-run 清单中(通过
WithTasksSetupPeripherals()
),在子命令将要运行之前自动调用Open()
这样一来,dbConn 就能在子命令运行之前被恰当地初始化,然后在子命令完成并退出到 OS 之前自动释放其占用的资源。
其中有两点值得注意,其一是即使子命令不如预期地退出,cmdr 仍能通过 recovery 机制获得释放 dbConn 以及其它已登记的 closers 的机会;其二是,如果用户输入命令行 app --help
等参数调用到 cmdr 内置选项而并不真正调用子命令时,dbConn 不必被无意义地初始化。
说明
在上面的示例程序中,app.OnAction()
闭包定义了根命令的响应函数,其中展示了怎么获取一个 Peripheral
对象并操作它。
dbConn 是一个数据库连接的管理对象,它实现了 Peripheral.Close()
接口,并且也实现了 cmdr 要求的 Open(ctx) error
接口。
因此,在 cmdr 命令将要被实际执行之前,&dbConn{}
这个实例将获得 Open()
机会,从而完成其自身的资源初始化。
而当 cmdr 命令实际执行完成之后,将要退出到 OS 环境之前,其 Close()
将被调用,从而完成资源清理工作。
收益
对于微服务 app 来说,WithPeripherals
是一个有利的辅助管理工具。
额外的话题
How is this guide?
Last updated on