在我的应用程序中,我使用Resque来调整图像大小。如果图像在调整大小队列中,我想显示“调整大小图像”图标。
这意味着我需要能够找到与队列中特定型号ID相关的所有当前作业。现在我这样做:
Resque.peek(:resize, 0, 100).find_all { |job| /#{model.id}/.match(job["args"][0]) }
这是愚蠢的。但有没有办法查询Resque队列以查找第一个参数等于 [id] 的所有作业?
提前致谢。
答案 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。