1

我正在 Rails 3.2.8 下设计一个 Web 服务,它将为用户执行外部程序,预期的用例是:

1) 用户填写参数表并提交请求

2) Rails 根据用户请求执行 Matlab 程序。它会持续几分钟(不到 3 分钟)并生成一个结果文件显示程序已完成

3) 在这个过程中,将用户重定向到一个页面显示“正在加载”状态,并监控是否生成了结果文件

4) 生成结果文件后,通过 AJAX 重新加载页面并显示结果。

有没有“rails”的方式来做到这一点?我以前在 JAVA SSH 框架中这样做过,但非常痛苦。我需要什么工具?例如,我是否需要像 backgroundjob 这样的 gem 来管理任务队列?或者是否有任何“单一”的宝石可以处理这个问题?谢谢!

4

2 回答 2

0

我有点想通在整个过程中使用什么:

1) 用户填写参数表并提交请求

使用此 rails cast 中的方法:http ://railscasts.com/episodes/219-active-model进行服务器端验证和 gem 'client-side-validations' 启用客户端检查。

2) Rails 根据用户请求执行 Matlab 程序。它会持续几分钟(不到 3 分钟)并生成一个结果文件显示程序已完成

使用 gem 'DelayedJob' 进行任务管理和 'ChildProcess' 来启动 Matlab 程序。

3) 在这个过程中,将用户重定向到一个页面显示“正在加载”状态,并监控是否生成了结果文件

监控子进程以及结果文件是否存在,检查任务是否完成。

4) 生成结果文件后,通过 AJAX 重新加载页面并显示结果。

使用此 rails cast 的轮询方法:http ://railscasts.com/episodes/229-polling-for-changes更新结果页面。我没有使用推送,尽管它会更安全——因为轮询似乎是一种更轻量级的解决方案并且可以满足我的要求。

显然这不是最佳实践,但满足了我的需求并且易于实施。感谢所有的评论和回答。

于 2012-10-13T04:04:49.267 回答
0

使用多个作业队列提供程序之一。示例包括 DelayedJob(最简单的一个,不需要额外的部分)、Resque 和 Sidekiq(快得多,但您需要一个小型 Redis 服务器来使用它们)。

“作业”将是(取决于提供者)实现执行的类或实例。如果它意味着在 shell 中运行某些东西,你可以这样做

%x[matlab command --options > output.ext]

(这只是一个例子,你也可以使用字符串插值%x[#{executable_name}]:)

于 2012-10-08T13:06:53.757 回答