使用 Heroku 进行 Vapor 4 预定作业

问题描述

我有一个 Vapor 4 应用程序,我在其中使用 queues 创建计划作业。这个特定的测试作业每五分钟打印一次日志。当我在本地运行项目时,一切都按预期工作。但是,当我部署到 Heroku 时,事情开始出现异常。根据 Heroku 日志,这个工作每五分钟就会被触发多次。它似乎也只是随机停止,不再开火。日志显示“进程以状态 0 退出”。

我在部署到 Heroku 时遗漏了什么吗?如何获得与我在本地看到的相同的功能

我在下面提供了所有日志的屏幕截图以及我的 procfile 和任何相关代码内容

更新:我将我的 Heroku 计划从“免费”更改为“爱好”,这阻止了服务器停止。免费计划在短时间内进入睡眠状态,这导致我的后台工作人员终止。不过,我仍然遇到重复问题。

enter image description here

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 首选)。”

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...