问题: 我本地调用自己项目的接口给 jenkins 发送请求,我想每隔 1 分钟调用下 jenkins 的接口看当前的任务是成功或者失败了,只有成功或者失败的时候,我本地这个接口才能结束,render 前端页面。
谢谢。
感谢。但是我查了下 ActiveJob 好像是 rails 4.2 才引进的,我项目比较老,rails 是 3.2,是否还有满足我需求的的低版本的 gem 吗?
你是从页面上发起的 action 吧,这样的话推荐前端自己解决。 流程: 1、前端触发 A action,这个 action 及时返回能标记此次 jenkins 任务的 id。 2、前端页面不跳转,每隔 1 分钟 ajax 请求 B action,用刚刚的 id 查询 jenkins 的结果,成功的话 ajax 刷新页面,不成功继续等待。
现在实现想法是在 controller 中加一个 action,也就是前端点击触发的:
def run_jenkins
第一步. 调用worker
第二步. 返回前端页面
end
在 run_jenkins 中执行第一步"调用 worker",是调用 model 中定义的方法,想在第二步“返回前端页面”前每间隔 1 分钟执行第一步,其实也就是一直走这个 worker,直到得到我想要的结果为止,才能执行第二步“返回前端页面”。
先回答刚刚您说的两个问题:1.worker 是阻塞操作吗?2.不返回前端页面用户端也一直阻塞吗? 1.是 2.是 问题 x 问题当下我是混乱的,说明起来我也不能保证我说的能表述清楚,我当前特别想知道这个 y 在 ruby 中要如何实现呢? 求指教,麻烦了,多谢。
要实现阻塞轮询,那么根本不用 worker:
def run_jenkins
white !jenkins_ready
sleep 60
end
render
end
这里有几个问题:
你还是先说说用户场景是什么?
我推测你想要的是,一个后台异步任务,定期轮训 Jenkins,把结果记录下来,这里要求不高可以用 Crontab 来实现,直接用现成的 whenever gem 就好,要求精度和稳定性的话,可以用 Sidekiq。
你的接口首先不能阻塞,会影响你系统吞吐量,其次有可能等待时间太久,浏览器直接认为请求超时,所以你的方案不靠谱。
如果最新(根据你的描述,可能设定为当前时间减去最近获取到的 Jenkins 记录的创建时间在一个间隔范围内)的结果没有收到考虑返回 404 之类的异常状态码。
https://ruby-doc.org/stdlib-2.6.3/libdoc/timeout/rdoc/Timeout.html
不过这种东西都不太靠谱就是...