在resque队列中查找特定作业

时间:2012-05-01 22:23:54

标签: ruby-on-rails ruby redis resque

在我的应用程序中,我使用Resque来调整图像大小。如果图像在调整大小队列中,我想显示“调整大小图像”图标。

这意味着我需要能够找到与队列中特定型号ID相关的所有当前作业。现在我这样做:

Resque.peek(:resize, 0, 100).find_all { |job| /#{model.id}/.match(job["args"][0]) }

这是愚蠢的。但有没有办法查询Resque队列以查找第一个参数等于 [id] 的所有作业?

提前致谢。

3 个答案:

答案 0 :(得分:10)

尝试resque-status。它是Resque的扩展,可添加作业跟踪。

  

resque-status提供了一组简单的类,它们扩展了resque的默认功能(0%猴子修补),为应用程序提供了跟踪特定作业实例及其状态的方法。它通过提供作业实例UUID并允许作业实例在迭代中报告其状态来实现此目的。

注意:d11wtq上面提到了这个评论,但到目前为止实际上是最好的答案

答案 1 :(得分:5)

您应该将图像元数据与模型一起存储,而不是查询resque队列。

让我们假设您正在存储产品图片。您可能使用Redis哈希来存储产品详细信息。只需添加另一个这样的标志 -

hset product:123 is_resizing true

您可以执行简单查找以显示调整大小图像图标。在您的resque作业结束时,删除is_resizing键,然后添加resized_image_url键。

答案 2 :(得分:0)

我认为最简单的方法可能是使用redis设置来缓存此信息。

将图像添加到'resize'队列时,还要使用SADD将图像ID添加到'resize_in_progress'集。 (我假设您有一些唯一的键或名称来引用图像,即使没有存储在数据库中。也许是文件名的完整路径。)

在“调整大小”过程中,作为成功调整图像大小后的最后一个操作之一,使用SREM命令将其从集合中删除。

如果需要所有图像的列表,可以使用SMEMBERS获取。如果您只想要特定模型ID的成员,您可能需要为每个模型存储一个单独的集合,名称类似于'resize_in_progress_3451',其中3451是模型的id,其中图像被调整大小。

有关更多set命令,请参阅http://redis.io/commands#set