从Vapor 3中的Job访问服务

问题描述 投票:2回答:2

我是Vapor和服务器端swift的新手,具有iOS开发背景(开发应用程序6年)。我正在尝试为设备管理构建一个简单的API,其中包括一个“作业”(Timer,无论你想叫它什么),它会在最后一次检查设备“Checked In”时每小时检查一次。

为此,我设置了Jobs包,但是我正在努力弄清楚如何访问服务(Ferno)来点击我的Firebase实时数据库以获取有关设备上次登录的信息。似乎根据docs你需要一个Container的实现者来创建/访问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"])
}
swift client-server vapor server-side-swift
2个回答
1
投票

我也和Ferno一直在挣扎。

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

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

现在您的客户端已准备好进行数据库操作,例如后期操作。每次使用您自己的作业时都可以重复。

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

1
投票

要做预定的任务,最好在scheduleRepeatedTask上使用EventLoop。你可以,例如在你的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做一个公关,用Request取代Worker,如果我在这里没有错过的话。然后你可以像这样调用它:

client.ferno.retrieve(worker: app, queryItems: [], appendedPath: ["devices"])
© www.soinside.com 2019 - 2024. All rights reserved.