我正在使用ruby on rails构建一个webapp,需要在后台运行C ++ exe程序。我比较了3个最常用的宝石(Delayed_Jobs,Resque,Sidekiq),发现resque是最适合我的。
在Countroller中我创建了这样的方法
def create
@model = Model.create(model_params)
# resque processe the file from the @model
Resque.enqueue(JobWorker, @model.file.url)
redirect_to model_path(@model.id)
end
在工人班我有
class JobWorker
@queue = :file
def perform file_to_process
# calling time consuming C++ here which generates 2 image files.
system('my_file_processing_program "#{file_to_process}"')
end
end
现在我的问题是我应该如何检测到该作业已完成?我想在C ++应用程序生成图像后将gemerated图像文件发送到客户端。 哪个用户可以查看/下载。
由于redirect_to model_path(@ model.id)将在创建控制器中的Resque.enqueue(JobWorker,@ model.file.url)之后返回。
我尝试使用resque-status但是需要在控制器中进行轮询以检查状态,如...
while status = Resque::Plugins::Status::Hash.get(job_id) and !status.completed? && !status.failed?
sleep 1
puts status.inspect
end
有什么建议吗?提前谢谢你......
答案 0 :(得分:1)
如果你想像faye(http://faye.jcoglan.com/ruby.html)那样去异步系统,那么你可以在完成这个过程后向前端发送一条消息。编写代码以在系统代码完成执行后发布消息。
另一个简单的步骤虽然可能不适合您,但是在流程结束时发送电子邮件。您可以向客户发送电子邮件,让他们知道"流程已完成访问链接以查看结果。"