在Resque队列中查找特定工作

9
在我的应用程序中,我正在使用Resque来调整图像大小。如果图像在调整大小队列中,则我想显示“正在调整大小的图像”图标。
这意味着我需要能够找到与特定模型ID相关的所有当前作业。现在我是这样做的:
Resque.peek(:resize, 0, 100).find_all { |job| /#{model.id}/.match(job["args"][0]) }

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

提前致谢。


我相信你可以在作业入队时捕获作业的 job_id,然后通过使用该 id 查找作业来检查作业的状态。显然,你需要将该 ID 存储在某个地方以便重复使用。 - d11wtq
实际上,你可能需要另一个宝石来完成这个任务。现在只是在进行试验。 - d11wtq
1
这可能会引起您的兴趣 https://github.com/quirkey/resque-status - d11wtq
@Ronze 为什么你认为 Resque.peek(:resize, 0, 100).find_all... 这个例子很愚蠢? - David J.
你应该使用Resque.queues[:resize]代替Resque.peek(:resize, 0, 100)。 - David J.
一些在Resque问题跟踪器上的请求要求作业ID:https://github.com/defunkt/resque/issues/6,https://github.com/defunkt/resque/issues/7和https://github.com/defunkt/resque/issues/15。阅读这些以获取各种解决方法。 - David J.
3个回答

10

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

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

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


resque-status是一个天才、无价的工具。特别是当你想要追踪长时间运行作业的完成百分比时。 - nessur

5

不要查询Resque队列,应该将图像元数据与您的模型一起存储。

假设您正在存储产品图像。您很可能使用Redis哈希来存储产品详细信息。只需添加另一个标志,如下所示 -

hset product:123 is_resizing true

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


1
谢谢。然而我的应用程序结构使这很难实现,因为我没有将这些图像存储在数据库中。这是我的应用程序要求。但是我可能需要某种表来告诉我当前正在调整大小的是什么。似乎确切的数据在Resque队列中。 - Ronze

0

我认为最简单的方法可能是使用Redis集合来缓存这些信息。

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

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

当您想要获取所有图像的列表时,可以使用SMEMBERS进行获取。如果您只想获取特定模型ID的成员,则可能需要为每个模型存储单独的集合,命名为“resize_in_progress_3451”,其中3451是正在调整大小的图像所属模型的ID。

请参见http://redis.io/commands#set以获取更多集合命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接