从 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"])
我对 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"])