我正在Rails 3.2.8下设计一个web服务,它将为用户执行外部程序,预期的用例是:
1)用户填写参数表单并提交请求
2) Rails根据用户请求执行Matlab程序。它将持续几分钟(不到3分钟),并生成一个结果文件,表明程序已完成
3)在此过程中,将用户重定向到页面会显示“正在加载”状态,并监控结果文件是否已生成
4)生成结果文件后,通过AJAX重新加载页面并显示结果。
有没有一种"rails“方法可以做到这一点?我以前在JAVA SSH框架中这样做过,但是非常痛苦。我需要什么工具?例如,我是否需要像backgroundjob这样的gem来管理任务队列?或者有没有什么“一站式”的gem可以处理这个问题?谢谢!
发布于 2012-10-08 21:06:54
使用多个作业队列提供程序之一。示例包括DelayedJob (有史以来最简单的一个,不需要额外的组件),Resque和Sidekiq (速度快得多,但你需要一个小的Redis服务器来使用它们)。
“作业”将是(取决于提供程序)实现执行的类或实例。如果这意味着在shell中运行某些东西,您可以这样做
%x[matlab command --options > output.ext](这只是一个例子,你也可以使用字符串插值:%x[#{executable_name}])
发布于 2012-10-13 12:04:49
我想出了在整个过程中应该使用什么:
1)用户填写参数表单,提交请求
使用rails cast中的方法:http://railscasts.com/episodes/219-active-model用于服务器端验证,gem ' client - side -validations‘启用客户端检查。
Matlab2) Rails根据用户请求执行程序。它将持续几分钟(不到3分钟),并生成一个结果文件,显示程序已完成
使用gem 'DelayedJob‘进行任务管理,使用'ChildProcess’启动Matlab程序。
3)在此过程中,将用户重定向到页面会显示“正在加载”状态,并监控结果文件是否已生成
监控子进程以及结果文件的存在,检查任务是否完成。
4)生成结果文件后,通过AJAX重新加载页面并显示结果。
使用rails cast:http://railscasts.com/episodes/229-polling-for-changes中的轮询方法更新结果页面。我没有使用推送,尽管它会更安全--因为轮询似乎是一种更轻量级的解决方案,可以满足我的需求。
显然,这不是最佳实践,但满足了我的需求,并且易于实现。感谢所有的评论和答案。
https://stackoverflow.com/questions/12774624
复制相似问题