Работает ли система "... &" на Heroku Cedar / Rails 3.1? - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть пара рейк-задач, выполняемых в фоновом режиме, используя технику RyanB из Railscast 127 , которая отлично работает локально и на Rails 3, но не на 3.1 при производстве на стеке кедровых изделий Heroku. Прежде чем я вырву их и заменим на delayed_job, должен ли этот метод разветвления процесса работать?

  def call_rake(task, options = {})
    options[:rails_env] ||= Rails.env
    args = options.map { |n, v| "#{n.to_s.upcase}='#{v}'" }
    system "rake #{task} #{args.join(' ')} --trace 2>&1 >> #{Rails.root}/log/rake.log &"
  end

1 Ответ

0 голосов
/ 22 сентября 2011

Отвечаю сам, после того, как копаться: системный бит делает, но не &.Delayed_job это способ пойти на это.Вот мой рабочий код для запуска задачи rake в приложении rails 3.1 с использованием delayed_job в стеке Heroku Cedar, для генерации файла XML, сохранения его в temp и затем загрузки в S3.Выходной файл XML большой, поэтому необходимо обрабатывать его асинхронно.

app / classes / callrake.rb:

class Callrake
  def call_rake(task, options = {})
      options[:rails_env] ||= Rails.env
      args = options.map { |n, v| "#{n.to_s.upcase}='#{v}'" }
      system "rake #{task} #{args.join(' ')} --trace 2>&1 >> #{Rails.root}/log/rake.log"

    end
  handle_asynchronously :call_rake
end

контроллер isbns:

def onixtwo 
#using Ransack, successor to Metasearch
  @q = Isbn.where(:client_id => current_user.client_id).search(params[:q])
   @isbns = @q.result(:distinct => true)
  if @q.nil? 
     @isbns = Isbn.where(:client_id => current_user.client_id)
  end
  #I have an array to pass so this is a bit hacky - make an array, pass it as a string then turn it back into an array using eval()
  is = []
  @isbns_to_pass = @isbns.each {|isbn| is << isbn.id }
  @client = current_user.client_id   
  @user = current_user.id
  callrake = Callrake.new
  callrake.call_rake(:onixtwo, :isbns => is, :client => @client, :user => @user)
  redirect_to isbns_path, :flash => { :notice => t(:isbnonixtwo).html_safe }

end

немного не по теме config / locales / en.yml для полноты:

en:
  isbnonixtwo: "Onix 2.1 message is generating. When it's done, you can download it from the <a href='/onixarchives'>Onix Archive</a> list."

грабли:

desc "Generate an onix 2.1 xml file"
task :onixtwo => :environment do |t|


  client_id = ENV["CLIENT"]
  user_id = ENV["USER"]
  isbns_passed = ENV["ISBNS"]
  isbnsarray = eval(isbns_passed)
  filename = "#{Rails.root}/public/#{Client.find_by_id(client_id).client_name}-#{Date.today}-#{Time.now}-onix-21.xml"    
  isbns = Isbn.find_all_by_id(isbnsarray)

 File.open(filename, "w") do |file|

    xml = Builder::XmlMarkup.new(:target => file, :indent => 2)
    xml.instruct!(:xml, :version => "1.0", :encoding => "utf-8")
    xml.declare! :DOCTYPE, :ONIXMessage, :SYSTEM, "http://www.editeur.org/onix/2.1/03/reference/onix-international.dtd"
    xml.ONIXMessage do
      xml.Header do 
#masses of code

  end  #of file 
  xmlfile = File.open(filename, "r")
  onx = Onixarchive.new(:client_id => client_id, :user_id => user_id) 
  onx.xml = xmlfile
  onx.save!
  end #of task

Затем Onixarchive имеет обычную установку скрепок в модели.

Обратите внимание на Rails.root.public в filepath - я продолжал получать «не существует», когда пытался писать в app / tmp, потому что, конечно же, когда я смотрел с помощью консоли heroku, нетпапка tmp.Я полагаю, я мог бы создать его, но это приложение на кедре, которое имеет эфемерную файловую систему , так что вы можете писать где угодно на время сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...