2016-07-11 52 views
2

是否:异步队列适配器实际上做了什么?Rails异步活动作业不执行代码,而行内却

:inline,这是Rails 4中的默认值,在当前执行线程中处理使用ActiveJob构建的作业,呃... inline。异步,不应该。它应该使用ConnectionPool在当前线程中不运行它,理想情况下会发生什么。它会在当前执行线程之外运行。

但没有执行它。

我对这篇文档感兴趣,唯一可以理解的是:异步,不像inline,不执行任务,并期望您在本地执行周围构建系统。我必须在所有作业上手动执行perform以使它们在本地执行。当我将适配器设置为:inline时,它无需执行就可以正常工作。

是否有一些配置问题我错过了防​​止异步正常工作(如ActionCable?)。

如果从rake任务(或控制台?)执行它,它不起作用吗?

它可以很好地与:sidekiq /:resque,但我不想在这些地方一直运行。

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

这是一种什么提示我在那里被一些错误的。我的工作是坐在排队的地方,只是不运行。有什么可以阻止呢?

回答

4

这就是我发现的。随着并发ruby的出现,rake任务不会被设置来处理这个问题。

如果您在文档中阅读过,它说的是:async,那么在过程结束时将其清除。

Rails本身只提供一个进程内排队系统,只有 保留RAM中的作业。如果进程崩溃或机器重置,则 ,则所有未完成的作业都会在默认异步后端丢失。

Rake进程在结束时结束。因此,如果您正在进行任何类型的数据更改,则rake任务的运行时间不足以运行作业,这就是为什么他们运行:inline就好,但不是:async

所以,我还没有想出一个解决方案来保持rake任务的运行时间足够长,以运行:async(并且始终保持应用:async)。我必须将其切换到:inline才能运行任务,然后在完成剩余的工作后返回:async。这就是为什么它可以与:sidekiq:resque一起工作,因为这些应用程序将作业信息保存在内存中,并且在耙机任务结束时不会释放。

为了耙任务与:async本地工作,有没有什么可以比运行的任务做其他的:inline如果你是本地直到耙(作为任务运行)懂得如何保持开放而异步任务已经推出(或不)。作为一个仅限于开发的功能,这并不是高优先级,但是,如果你在桌面上b your不理,为什么:async默认运行作业的任务不能真正运行,这就是为什么。

+0

@januszm很高兴我可以给你一点帮助。 – tadiou