【发布时间】:2011-07-31 17:18:15
【问题描述】:
我有一个通常需要几秒钟才能完成的过程,所以我尝试使用delayed_job 来异步处理它。工作本身运行良好,我的问题是如何对工作进行轮询以了解它是否已完成。
我可以通过简单地将其分配给一个变量来从delayed_job 中获取一个id:
job = Available.delay.dosomething(:var => 1234)
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
| id | priority | attempts | handler | last_error | run_at | locked_at | failed_at | locked_by | created_at | updated_at |
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
| 4037 | 0 | 0 | --- !ru... | | 2011-04-... | | | | 2011-04... | 2011-04-... |
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
但一旦完成作业,它就会将其删除并搜索已完成的记录会返回错误:
@job=Delayed::Job.find(4037)
ActiveRecord::RecordNotFound: Couldn't find Delayed::Backend::ActiveRecord::Job with ID=4037
@job= Delayed::Job.exists?(params[:id])
我是否应该费心改变这一点,或者推迟删除完整记录?我不知道我还能如何获得它的状态通知。还是轮询死记录作为完成证明可以吗?还有其他人面临类似的情况吗?
【问题讨论】:
-
我面临的另一个问题或障碍是,我正在抵消这份工作,因为否则它会占用我的服务器。我询问数据库是否存在某些带有日期的数据,如果它们不存在或已过时,我会获取新数据,但是作为一项单独的工作,我使用 AJAX 并轮询直到它完成......然后运行再次查询新数据。让它变得更快,但也更复杂。
-
使用 resque 和 redis 之类的东西并基本上缓存返回的对象,这样可以节省更多往返数据库的时间,并使轮询速度更快吗?我从来没有接触过 redis 或 resque,所以我想我会把它扔在那里。
标签: ruby-on-rails ruby-on-rails-3 backgroundworker push-notification delayed-job