Host Service 场景

有时候可能需要建立一些独立于应用逻辑体本身的后台任务。比如:定时发送邮件、定时执行脚本这类持续运行的任务,也有验证数据库是否创建等只伴随应用启动而执行一次的任务。

我们提供了一个叫做 IHostedService 的接口,它可以便于我们更好的实现托管服务。

它是伴随hosting一同启动的任务,并拥有相同的生命周期。

目前我们实现了xxl-job的场景,用于定时的后台任务,并常驻进程。

IHostService接口

  1. type IHostService interface {
  2. // Run Triggered when the application host is ready to start the service.
  3. Run() error
  4. // Stop Triggered when the application host is performing a graceful shutdown.
  5. Stop() error
  6. }

实现一个HostService

  1. type Service1 struct {
  2. }
  3. // 这里可以注入类型参数
  4. func NewService() *Service1 {
  5. return &Service1{}
  6. }
  7. func (s *Service1) Run() error {
  8. fmt.Println("host service Running")
  9. return nil
  10. }
  11. func (s *Service1) Stop() error {
  12. fmt.Println("host service Stopping")
  13. return nil
  14. }

注册HostService

需要将实现接口注册到DI交由框架管理,HostService作为框架的扩展点,在Hosting启动与关闭时会自动调用HostService的相应方法

  1. ConfigureServices(func(collection *dependencyinjection.ServiceCollection) {
  2. hosting.AddHostService(collection, NewService)
  3. })

这里注册的NewService构造器可以使用DI带来的参数注入等特性。一个Hosting宿主可以注册多个HostService