问题描述
我有一个 Vapor 4 应用程序,我在其中使用 queues 创建计划作业。这个特定的测试作业每五分钟打印一次日志。当我在本地运行项目时,一切都按预期工作。但是,当我部署到 Heroku 时,事情开始出现异常。根据 Heroku 日志,这个工作每五分钟就会被触发多次。它似乎也只是随机停止,不再开火。日志显示“进程以状态 0 退出”。
我在部署到 Heroku 时遗漏了什么吗?如何获得与我在本地看到的相同的功能?
我在下面提供了所有日志的屏幕截图以及我的 procfile 和任何相关代码的内容。
更新:我将我的 Heroku 计划从“免费”更改为“爱好”,这阻止了服务器停止。免费计划在短时间内进入睡眠状态,这导致我的后台工作人员终止。不过,我仍然遇到重复问题。
public func configure(_ app: Application) throws {
if let databaseURL = Environment.get("DATABASE_URL"),var postgresConfig = PostgresConfiguration(url: databaseURL) {
postgresConfig.tlsConfiguration = .forClient(certificateVerification: .none)
app.databases.use(.postgres(
configuration: postgresConfig
),as: .psql)
}
//MARK: Migrations
//...
// MARK: Queue and Jobs
let testJob = TestJob(app: app)
try app.queues.use(.redis(url: "redis://127.0.0.1:6379"))
for i in stride(from: 0,to: 60,by: 5){
let minutes = ScheduleBuilder.Minute(integerLiteral: i)
app.queues.schedule(testJob).hourly().at(minutes)
}
try app.queues.startScheduledJobs()
// MARK: Register Routes
try routes(app)
}
struct TestJob: ScheduledJob {
let app: Application
func run(context: QueueContext) -> EventLoopFuture<Void> {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .long
print("\n********* Test job: \(formatter.string(from: Date())) *********")
return context.eventLoop.makeSucceededVoidFuture()
}
}
简介
web: Run serve --env production --hostname 0.0.0.0 --port $PORT
worker: Run queues --scheduled
解决方法
您是否阅读了此处的提示。 Heroku 可能需要配置来保持你的队列进程运行 https://docs.vapor.codes/4.0/queues/
“工人应该在生产中保持运行。请咨询您的托管服务提供商以了解如何保持长时间运行的进程处于活动状态。例如,Heroku 允许您在 Procfile:worker: Run queues 中指定这样的“worker”dynos。有了这个,您可以在仪表板/资源选项卡上启动工作程序,或者使用 heroku ps:scale worker=1(或任意数量的 dynos 首选)。”