Rails Rails 有没有类似于 Java 任务调度的 gem?

hopenofool · 2019年05月28日 · 最后由 hging 回复于 2019年05月31日 · 2438 次阅读

问题: 我本地调用自己项目的接口给 jenkins 发送请求,我想每隔 1 分钟调用下 jenkins 的接口看当前的任务是成功或者失败了,只有成功或者失败的时候,我本地这个接口才能结束,render 前端页面。

谢谢。

ActiveJob 用 wait 参数延时执行,任务末尾需要轮询的时候 enqueue 自己。

Rei 回复

感谢。但是我查了下 ActiveJob 好像是 rails 4.2 才引进的,我项目比较老,rails 是 3.2,是否还有满足我需求的的低版本的 gem 吗?

hopenofool 回复

whenever 估计可以

hopenofool 回复

sidekiq

ForrestDouble 回复

好的,感谢。

Rei 回复

好的,谢谢。

我们公司有一个ruby 1.9.3 / rails 3.x 的项目

在用 sidekiq-cron

mapana 回复

谢谢,我看下。

你是从页面上发起的 action 吧,这样的话推荐前端自己解决。 流程: 1、前端触发 A action,这个 action 及时返回能标记此次 jenkins 任务的 id。 2、前端页面不跳转,每隔 1 分钟 ajax 请求 B action,用刚刚的 id 查询 jenkins 的结果,成功的话 ajax 刷新页面,不成功继续等待。

为什么不成功或者失败的时候,jenkins 发个请求?

zj0713001 回复

嗯嗯,这个好,是应该这样做。

yfractal 回复

特殊需求,用 jenkins 集成第三方。

现在实现想法是在 controller 中加一个 action,也就是前端点击触发的:

def run_jenkins
  第一步. 调用worker
  第二步. 返回前端页面
end

在 run_jenkins 中执行第一步"调用 worker",是调用 model 中定义的方法,想在第二步“返回前端页面”前每间隔 1 分钟执行第一步,其实也就是一直走这个 worker,直到得到我想要的结果为止,才能执行第二步“返回前端页面”。

hopenofool 回复

两个问题:

  1. worker 是阻塞操作吗?
  2. 不返回前端页面用户端也一直阻塞吗?
Rei 回复

不好意思,我没有把问题表达清楚,我好好看看您发的 X-Y 再来回复。

Rei 回复

先回答刚刚您说的两个问题:1.worker 是阻塞操作吗?2.不返回前端页面用户端也一直阻塞吗? 1.是 2.是 问题 x 问题当下我是混乱的,说明起来我也不能保证我说的能表述清楚,我当前特别想知道这个 y 在 ruby 中要如何实现呢? 求指教,麻烦了,多谢。

hopenofool 回复

要实现阻塞轮询,那么根本不用 worker:

def run_jenkins
  white !jenkins_ready
    sleep 60
  end
  render
end

这里有几个问题:

  1. 用户执行这个操作后,页面就挂住了,好像服务器失去响应一样。
  2. app server 通常会有超时设置,例如超过 30 秒没完成就强制退出。
  3. 基于进程或线程的 app server 并发数减一,并会最终卡死。

你还是先说说用户场景是什么?

我推测你想要的是,一个后台异步任务,定期轮训 Jenkins,把结果记录下来,这里要求不高可以用 Crontab 来实现,直接用现成的 whenever gem 就好,要求精度和稳定性的话,可以用 Sidekiq。

你的接口首先不能阻塞,会影响你系统吞吐量,其次有可能等待时间太久,浏览器直接认为请求超时,所以你的方案不靠谱。

如果最新(根据你的描述,可能设定为当前时间减去最近获取到的 Jenkins 记录的创建时间在一个间隔范围内)的结果没有收到考虑返回 404 之类的异常状态码。

@jasl 大大我想请教一个问题,在 ruby 中如何做到 javascript 中的 setTimeout 函数的功能。

jasl 回复

😂 谢谢提醒,我去学习一下

https://github.com/adamwiggins/clockwork 这个玩意儿也挺好用的。另外起一个进程。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号