2012-01-18 8 views
12

Üretimde Radar 3 uygulamasında Apache'de Yolcu ile var. Bu kodu vardır: uygulaması bir fatura oluşturduğunda bunu kaydedildikten sonra, uygulama kullanıcıya bir e-posta gönderirParalel işlem oluşturmak için Ruby on Rails çatalı kullanımı

localhost olarak
class Billing < ActiveRecord::Base 
    after_save :sendEmails 

    private 
    def sendEmails 
     fork do 
     UserMailer.clientBilling(self.user, self).deliver 
     end 
    end 
end 

, her şey gayet iyi çalışıyor. Ama sunucuda, uygulama bir fatura oluşturduktan sonra, bana MySQL2, "MySQL sunucusu gitti" veya "Bağlantı kayboldu" gibi hatalar ile ilgili hataları atar ve uygulama e-postaları göndermez. Çatalları çıkarırsam iyi çalışır, ancak çatal kullanmak istiyorum, e-posta gönderirken uzun zaman alacağı için ayrı bir işlem oluşturmak istiyorum. Sorun ne olabilir?

cevap

17

Sorun, çatallı bir işlemin, dosya tanıtıcıları gibi ebeveyninin bazı kaynaklarını devralmasıdır. Özellikle böyle bir paylaşılan kaynak MySQL bağlantısıdır. Çocuk işlemi e-postasını gönderdiğinde ve çıkarsa, ana işlemler bağlantısını kapatan MySQL bağlantısını kapatır.

sizin (ve benzer inceliklerini frought olan) o zaman sonra

::ActiveRecord::Base.clear_all_connections! 
çatal Senden önce

ve

::ActiveRecord::Base.establish_connection 

gibi bir şey yapmanız gereken bu yolu devam yaparsanız. Bunları kullanıyorsanız, memcached veya mongodb gibi servislerle benzer şeyler yapmak zorunda kalacaksınız.

+0

Hangi kaynakların devraldığını biliyor musunuz? Süreç çatalı tüm süreci kopyalar mı? Bütün raylar çevre bir çatalda tekrar yüklenmedi mi? –

+1

Tüm süreci kopyalar, ancak dosya tanıtıcıları aynı dosyaya başvururlar (fork için man sayfasına bakınız) –

+0

ActiveRecord'un genellikle bunu şeffaf olarak yöneteceğinden, 'build_connection' her zaman gerekli olmadığını buldum. – spume

9

Çatal/raylı yolcuları kullanırken çok dikkatli olun, çok dağınık olabilir! Bunun yerine, bu görev için resque or delayed_job kullanmalısınız!

+2

Ben keşfetmek için 7 gün sürdüğünü hata msg "Mysql :: Hata: sorgusu sırasında MySQL sunucusuna Kayıp bağlantı" ve "MySQL :: Hata : MySQL sunucusu gitti "çatal kullanımı sonucu oldu. –

2

Sen çatalın iç bağlantıyı yeniden kurmak olabilir:

dbconfig = YAML::load(File.open('your_app_dir/config/database.yml')) 
ActiveRecord::Base.establish_connection(dbconfig['development'])