从 Vapor 3 中的作业访问服务

Access a service from a Job in Vapor 3

我对 Vapor 和服务器端 swift 非常陌生,具有 iOS 开发背景(6 年开发应用程序)。我正在尝试为设备管理构建一个简单的 API,其中包括一个 "job"(定时器,无论你想怎么称呼它),它每隔一小时左右检查一次设备 "Checked In".

为此,我已经设置了 Jobs 程序包,但是我正在努力弄清楚如何访问服务 (Ferno) 以访问我的 Firebase 实时数据库以获取有关设备最后使用时间的信息登录。根据文档,您似乎需要 Container 到 create/access 和 Service 的实现者,但似乎没有任何类型的全局容器我可以使用。

我是否应该尝试创建自己的 Request 来访问 Ferno 服务?或者有什么方法可以访问全局 app?

以下是我目前所做的,但我所做的似乎大错特错!肯定有办法实现这个目标吧?

Jobs.add(interval: (60*30).seconds) { [weak devicesController] in
    devicesController?.checkForNotSeenDevices()
}
func checkForNotSeenDevices() throws {

    let client = try app(.detect()).make(FernoClient.self)
    client.ferno.retrieve(req: ???, queryItems: [], appendedPath: ["devices"])
}

我也曾与 Ferno 斗争过。

在 boot.swift 内部,使用全局应用程序作为 ferno 客户端和请求的容器。

    let client = try! app.make(FernoClient.self)
    let request = Request(using: app)

现在您的客户端已准备好执行数据库操作,示例 post action.Which 每次都可以使用您自己的作业重复。

    let inputData = try! client.ferno.overwrite(req: request, appendedPath: ["users/john"], body: yourOwnContentModel)

要执行计划任务,最好在 EventLoop 上使用 scheduleRepeatedTask。你可以例如在你的 boot.swift:

中调用它
app.eventLoop.scheduleRepeatedTask(initialDelay: .seconds(0), delay: .minutes(30)) { _ in
    let client = try app.make(FernoClient.self)
    let request = Request(using: app)
    client.ferno.retrieve(req: request, queryItems: [], appendedPath: ["devices"])
}

其实FernoClient().client.retrieve并不需要Request,而是Worker。不幸的是,该库明确指出 Request,因此您需要使用此解决方法。如果我没有遗漏任何内容,您可以向 Ferno 提交 PR 并将 Request 替换为 Worker。那么你可以这样称呼它:

client.ferno.retrieve(worker: app, queryItems: [], appendedPath: ["devices"])