使用ActiveJob AsyncAdapter列出排队的任务列表

8

有没有办法可以查看队列中剩余的作业数量(甚至检查每个作业)?


嘿,如果你已经尝试过以下建议,请让我知道它是否有效 - 我有点好奇,但还没有时间测试它 :) (也许在周末)。 - Andrey Deineko
我也一样 :) 今天没法测试。让我看看明天早上能不能做到 ;) - alexandernst
1个回答

7

经过一番研究 源代码 ,我发现:

ActiveJob::QueueAdapters::AsyncAdapter 使用Concurrent Ruby线程池来调度和执行任务。

在你的配置中初始化适配器时,你需要传递执行器选项,这些选项实际上是Concurrent::ThreadPoolExecutor类的initialize方法的参数。

创建Concurrent::ThreadPoolExecutor类的实例后,它具有以下方法:

也就是说,我认为类似这样的内容应该能满足您的需求:

ActiveJob::Base
  .queue_adapter
  .instance_variable_get(:@scheduler)
  .instance_variable_get(:@async_executor)
  .public_send(:queue_length)

以上操作如下:
  1. 获取适配器
  2. 获取指向其实例变量 @scheduler 的指针,该指针指向 Concurrent::ThreadPoolExecutor 的实例(Scheduler 类的实例变量 - @async_executor
  3. 您可以在此实例上调用上述方法(queue_lengthscheduled_task_countothers

虽然我没有测试过,请确保仔细检查是否有错别字或其他问题。


好的,我刚刚尝试了一下。似乎不起作用。它总是返回0。 - alexandernst
1
@alexandernst,想一想,它返回一个整数,因此我非常确定它在某种意义上是有效的,即它调用了正确的方法。你尝试过其他方法吗?另外,你确定它不应该返回0吗? - Andrey Deineko
我尝试了这个解决方案。我尝试了 queue_lengthscheduled_task_countcompleted_task_count。它们总是返回 0 - mario199
获取适配器的async_executor返回一个Concurrent::ThreadPoolExecutor实例。问题在于,由于某种原因,Concurrent::ThreadPoolExecutor计数没有更新。 - robertoplancarte

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