Rails3 使用rake启动后台任务

之前写了一篇博客, 在rails中可以使用rake在后台执行特性任务

 

关于后台执行rake任务,再补充一点,有些时候,rake任务需要从页面获取表单元素,作为rake的参数来执行

 

 

namespace "autotest" do
  desc "puts user's name by say"
  task :say, [:first_name, :last_name] do |t, args|
    puts "First name is #{args.first_name}"
    puts "Last  name is #{args.last_name}"
  end
end

 

这个rake任务,可以看做一个函数,:say是函数名, [:first_name, :last_name]可以看做是参数

在命令行中执行 rake autotest:say["hello","world"],可以看到rake通过args获取到了参数

 


Rails3 使用rake启动后台任务

 

再举个例子:

比如:iteye中有个功能叫:做电子书, 执行的时候,它会立即返回一个提示:电子书正在生成,大概需要30分钟,稍后会发送站内信通知, 这样一个功能就可以用rake来做

 

简单的模拟一下:在表单中发送文件名,然后调用rake,来创建这样一个文件,为了模拟电子书的制作,可以再rake中sleep一会, 但是页面不会停,而是立即返回一个提示, 文件正在创建,请稍后。。

 

控制中,获取表单提交的文件名(这里写死),然后调用rake create_file 

 

 

class HomeController < ApplicationController
  def index
    file_name = "test.txt"
    system "start rake create_file['#{file_name}']"
  end
end

 

在rake任务中sleep 10秒,可以想象成做电子书的过程,最后杀死start开启的命令行,因为我不知道怎么关了它

 

 

desc "create file in F:\\"
task :create_file, [:file_name] do |t, args|
  sleep 10
  File.open("F:\\#{args.file_name}", "w")
  system "Taskkill /F /IM cmd.exe"
end

 

试图页面比较简单,在index.html.erb文件中

 

 

<h2>file create success!</h2>

 

这样,当我访问index页面时,页面会立即返回文件创建成功的提示,而在后台启动了rake任务,去执行创建文件的操纵

因为rake会自启动一个子进程,而不会影响rails的执行,rake任务执行完成后,可以通过发送邮件的形式来通知用户操纵已完成。

 

注意:

1. rake代码可直接写在工程根目录下的rakefile文件中,使用rake -T可以查看rake任务是否成功创建

2. rake任务的描述 desc 不能少,否则使用rake -T是检查不到的,命名空间可以根据需要添加

3. 另外rake任务可以放在lib/tasks文件夹下,但是我这里就是看不到,可能我用的是windows的原因吧

 

 

#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

TestRake::Application.load_tasks
desc "create file in F:\\"
task :create_file, [:file_name] do |t, args|
  sleep 10
  File.open("F:\\#{args.file_name}", "w")
  system "Taskkill /F /IM cmd.exe"
end

namespace "autotest" do
  desc "puts user's name by say"
  task :say, [:first_name, :last_name] do |t, args|
    puts "First name is #{args.first_name}"
    puts "Last  name is #{args.last_name}"
  end
  
  desc "puts user's name by hello"
  task :hello, [:first_name, :last_name] do |t, args|
    puts "First name is #{args.first_name}"
    puts "Last  name is #{args.last_name}"
  end
end
 

补充一个参数传递的方法,使用ENV

 

 

class HomeController < ApplicationController
  def index
    file_name = "test.txt"
    system "start rake c_file name=#{file_name} "
  end
end

 

desc "create file in F:\\"
task :c_file do
  File.open("F:\\#{ENV["name"]}", "w")
  system "Taskkill /F /IM cmd.exe"
end
 

 

你可能感兴趣的:(rake)