2012-03-28 21 views
3

私は多くの電子メールを送信する必要があり、これらの電子メールのために多数のユーザー通知を作成するアプリケーションを作成しています。このタスクは、Herokuでタイムアウトを生成します。これを解決するために、私はResqueとRedistToGoを使うことにしました。Resque with Rails 3 + Heroku + RedisToGo PostgreSQLエラー

私がしたことは電子メールを送信することでした(これは実際にはSendGridを使用して電子メールを送信しています)、Resqueワーカーを使用して通知を作成します。電子メールはすでに作成されているので、すべての受信者とともにIDをワーカーに送信します。

これはローカルで正常に動作します。プロダクションでは、Herokuでアプリを再起動しない限り、1度しか動作しません。私は労働者をエンキューafter_createを持っている電子メールのモデルを持っている

#lib/tasks/resque.rake 
require 'resque/tasks' 

task "resque:setup" => :environment do 
    ENV['QUEUE'] = '*' 
end 

desc "Alias for resque:work (To run workers on Heroku)" 
task "jobs:work" => "resque:work" 


#config/initalizers/resque.rb 
ENV["REDISTOGO_URL"] ||= "redis://redistogo:[email protected]_url:some_number/" 

uri = URI.parse(ENV["REDISTOGO_URL"]) 
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 

Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file } 


#app/workers/massive_email_sender.rb 
class MassiveEmailSender 
    @queue = :massive_email_queue 

    def self.perform(email_id, recipients) 
    email = Email.find(email_id.to_i) 
    email.recipients = recipients 
    email.send_email 
    end 

end 

class Email < ActiveRecord::Base 

... 

after_create :enqueue_email 

    def enqueue_email 
    Resque.enqueue(MassiveEmailSender, self.id, self.recipients) 
    end 

... 

end 

このメールモデルもsend_emailメソッドを持っている私は自分のコードとエラーメッセージの一部を掲載します私が前に言ったことをします

私は次のエラーメッセージが表示されます。私はResqueが私に与えたすべての情報つもりのポストだ:これによると

Worker 
    9dddd06a-2158-464a-b3d9-b2d16380afcf:1 on massive_email_queue at just now 
    Retry or Remove 
Class 
    MassiveEmailSender 
Arguments 

    21 
    ["[email protected]", "[email protected]"] 

Exception 
    ActiveRecord::StatementInvalid 
Error 
    PG::Error: SSL error: decryption failed or bad record mac : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"emails"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum 

    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `async_exec' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `exec_no_cache' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `block in exec_query' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
    /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:31:in `block in log_with_newrelic_instrumentation' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped' 
    /app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:28:in `log_with_newrelic_instrumentation' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `exec_query' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1264:in `column_definitions' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:858:in `columns' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `yield' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `default' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:237:in `columns_hash' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/delegation.rb:7:in `columns_hash' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:330:in `find_one' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:107:in `find' 
    /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/querying.rb:5:in `find' 
    /app/app/workers/massive_email_sender.rb:5:in `perform' 

、それがあるべきとおりに...最初の引数は電子メールIDで、2つ目は、すべての受信者のリストです。 。

誰でも手伝ってもらえますか?ありがとう!

+0

私は全く同じ問題があります。あなたはそれを解決することができましたか? – Arkan

+2

私は私の問題を解決し、あなたが私の解決策、http://stackoverflow.com/questions/9961044/postgres-error-on-heroku-with-resque/9964924#9964924 – Arkan

+0

感謝を見つけるために私のポストに見ることができ、 Arkan、それは働いた – sauronnikko

答えて

4

私は同じ問題に遭遇しました。あなたがアクティブレコードを使用していると仮定すると、あなたはそれが古いデータベースに接続していないことを確認するために、各フォークResqueワーカーのためのActiveRecord::Base.establish_connectionを呼び出す必要があります。これを入れてみてくださいlib/tasks/resque.rake

task "resque:setup" => :environment do 
    ENV['QUEUE'] = '*' 
    Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection } 
end 
関連する問題