2012-10-08 28 views
1

我设计下的Rails 3.2.8的web服务,将针对用户执行外部程序,预期使用情况是:的Rails 3异步外部程序

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

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

3)在此过程中,将用户重定向到页面显示“加载”状态,并监视结果文件是否有已生成

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

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

+0

您可以使用Resque管理后台任务,并像剑圣(尽管它过时了,读了笔者的建议GitHub的页面)将数据推送到客户端时,后台作业完成。 –

+0

你可能全都在这,但以防万一:为*非常小心*有这样的,你不把任何unsanitised数据输入到表格到您的命令行的东西,否则你是一个“RM - rf/*'远离灾难...... –

+0

谢谢保罗,我会非常小心的对我的验证:)。同样感谢saverio,在接下来的两天里我有点忙,但是会尽快尝试你的建议,看看是否接受它。 – Xiaoli

回答

0

使用多个作业队列提供程序之一。例子包括DelayedJob(有史以来最简单的一个,不需要额外的部分),Resque和Sidekiq(速度更快,但你需要一个小的Redis服务器来使用它们)。

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

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

(这只是一个例子,你可以用串插过:%x[#{executable_name}]

+0

嗨@saverio,我看到DelayedJob适合管理队列。但是,我没有看到它提供的很多监视功能。我如何知道任务是否结束?我要监听DJ数据库吗?对于我的用例,每次用户启动任务时,都会构建一个带时间戳的任务文件夹,并在该文件夹中生成所有结果文件。所以'加载'页面也应该继续监视文件夹。看来我们无法将时间戳存储在DJ数据库中吗? (Matlab是痛苦的,因为它似乎无法被重定向到标准输出,或者这将是一个容易得多...) – Xiaoli

+0

也是另一个问题是,如果我们使用%×[]开始MATLAB,它将由算是完成DJ一旦MATLAB程序开始运行(而不是当计算真正完成) – Xiaoli

+0

每个队列系统有其自身的特点,如果DJ没有足够的监控,请选择其它,或者只是做了'matlab'处理完毕后,有关的东西。 – rewritten

0

我有点想通了,整个过程中要使用什么过程:

1)用户填写的参数的形式,并提交请求

使用的方法,从该轨道铸造:http://railscasts.com/episodes/219-active-model用于服务器端验证和宝石'客户端验证'来启用客户端检查。

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

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

3)在此过程中,重定向用户到一个页面显示“加载”状态,并监控如果结果文件已经生成

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

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

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

显然,这不是最好的做法,但满足我的需求,易于实现。感谢所有的评论和答复。