2013-05-06 1 views
0

Mon script envoie des courriels pour la liste des utilisateurs. J'ai besoin de multithreading parce que l'erreur dans 1 adresse plante toute l'application. Ceci est ma mise en œuvre:ruby ​​1.8.7 courrier multithread 'constante non initialisée (NameError)'

require 'thread' 
    <...> 
    lock = Mutex.new 
    lock.synchronize { 
    @model.certs.each{ |user| 
     @threads << Thread.new(user) { |data| 
     to = "#{data['name']} #{data['surname']} <#{data['email']}>" 
     subject = '<Subject>' 
     body = "<Body>" 
     view = View.new() 
     view.to = to 
     view.body = body 
     view.subject = subject 
     view.attachment = '' 
     view.sendMessage() 
     @model.sended(data['email']) 
     } 
    } 
    } 

    @threads.each { |t| 
    begin 
     t.join 
    rescue => err 
     $log.fatal(err) 
    end 
    } 

view.sendMessage consiste:

require 'mail' 
require 'net/smtp' 
<...> 
smtp = Net::SMTP.start(@mailserver) 
mail = Mail.new() 
mail.from = @from 
mail.to = @to 
mail.subject = @subject 
mail.body = @body 
if [email protected]? 
    mail.add_file @attachment 
end 
mail.delivery_method :smtp_connection, { 
    :connection => smtp 
} 
mail.deliver 

Et parfois lui donne de telles erreurs que:

uninitialized constant Mail::Field::FromField (NameError) 
/var/lib/gems/1.8/gems/mail-2.4.4/lib/mail/field.rb:189:in `new_field' 

ou

uninitialized constant Mail::CommonAddress::AddressList (NameError) 
/var/lib/gems/1.8/gems/mail-2.4.4/lib/mail/fields/common/common_address.rb:9:in `parse' 

Je n'ai aucune idée, comment il peut être réparé. L'ajout de Mutex n'a aucun résultat.

Répondre

0

@FrederickCheung a raison de require dans les threads. En outre, avez-vous vraiment besoin de discussions? Quel est le problème avec:

emails.each do |mail| 
    begin 
    mail.deliver 
    rescue TheCorrectExceptionForInvalidEmails 
    puts "invalid e-mail: x" 
    method_to_remove_invalid_email_from_database 
    end 
end 

Même si vous laissez un bloc vide pour le sauvetage, dans un e-mail non valide, il sautera et continuer l'exécution.

+0

Je dois envoyer d'autres emails, pas seulement gérer les erreurs. – Michael

+0

Même si vous n'implémentez pas la méthode pour gérer le courrier électronique incorrect, vous pouvez continuer à envoyer. Vérifiez mon édition – fotanus

+0

Il ressemble à mon ancienne version de code, ce qui bloque toute l'application. Je vais essayer cette solution demain encore. Merci. – Michael

2

Exiger n'est pas threadsafe en ruby. Vous devez vous assurer que tout ce dont vous avez besoin est déjà requis avant de commencer vos discussions.

En outre, votre mutex ne fait rien actuellement. Bien que le multithreading puisse convenir à une activité comme l'envoi de courriels qui est probablement dominé par la latence du réseau, je ne dirais pas que la gestion des erreurs est une raison d'utiliser le multithreading (si cela le rend plus difficile).

+0

IMHO require-error doit être constamment non périodique comme c'est dans mon cas. Ok, je vais en lire plus sur mutex. Et quelle bonne pratique je devrais utiliser pour gérer ce type d'erreur au lieu de threading? – Michael

+0

Avec les threads il y a des conditions de course dans require - thread 1 est à mi-chemin du chargement de la librairie, le thread 2 finit par utiliser la librairie partiellement chargée –

Questions connexes