2010-12-30 17 views
1

以下のコードは、最大150個の連続したスレッドで正常に動作します。それ以上のものやサーバーが応答しなくなっています。マルチスレッドを正しく統合する方法を提案してください。私はThreadPoolExecutorとArrayBlockingQueueを考えるが、私は、私が使用するか、このクラスの他のソリューションより適切なことができるとそこにすでにライブラリーがある場合に尋ねると思った:Springのカスタム電子メールサービス - 改善に役立つ必要があります

@Transactional 
public class EmailServiceImpl implements EmailService{ 

private static final Logger log = Logger 
     .getLogger(MailNotificationServiceImpl.class); 
private JavaMailSender mailSender; 
private MessageSource messageSource; 
private FreeMarkerConfigurer freemarkerConfig; 

public void sendEmail(final String subject, final String recipient, final ModelMap mm, final String emailTemplate, final String from) { 

    try { 
     MimeMessagePreparator preparator = new MimeMessagePreparator() { 
      public void prepare(MimeMessage mimeMessage) throws Exception { 
       MimeMessageHelper message = new MimeMeaassageHelper(

       mimeMessage); 
       message.setFrom(from); 
       message.setTo(recipient); 
       message.setSubject(subject); 

       //freemarker integration 
       Template textTemplate = freemarkerConfig.getConfiguration().getTemplate(emailTemplate); // "/WEB-INF/email/*.ftl" 
       log.debug(emailTemplate); 
       final StringWriter textWriter = new StringWriter(); 
       textTemplate.process(mm, textWriter); 

       message.setText(textWriter.toString(), true); 
      } 
     }; 
     Thread thread = new SendMail(preparator); 
     thread.start(); 

    } catch (Exception e) { 
     log.error(e); 
    }   
} 


class SendMail extends Thread { 
    MimeMessagePreparator preparator; 

    SendMail(MimeMessagePreparator preparator) { 
     this.preparator = preparator; 
    } 

    public void run() { 
     log.debug("About to send email:"); 
     mailSender.send(preparator); 
     log.debug("Email send."); 
    } 
} 



public void sendEmail(final String subject, final String recipient, final ModelMap mm, final String emailTemplate, final boolean flag, final String from) { 
    if(flag){ 
     sendEmail(subject, recipient, mm, emailTemplate, from); 
    } 
} 

public void sendEmail(final String subject, final String recipient, final ModelMap mm, final String emailTemplate, final boolean flag) { 
    if(flag){ 
     sendEmail(subject, recipient, mm, emailTemplate, "[email protected]"); 
    } 
}  

public void sendEmail(final String subject, final String recipient, final ModelMap mm, final String emailTemplate) { 
     sendEmail(subject, recipient, mm, emailTemplate, "[email protected]"); 
}  

public void setMailSender(JavaMailSender mailSender) { 
    this.mailSender = mailSender; 
} 

private String gm(String messageName) { 
    return messageSource.getMessage(messageName, null, null); 
} 

public void setMessageSource(MessageSource messageSource) { 
    this.messageSource = messageSource; 
} 

public void setFreemarkerConfig(FreeMarkerConfigurer freemarkerConfig) { 
    this.freemarkerConfig = freemarkerConfig; 
} 

} 
+0

@Transactional?これについて正確に何がトランザクションですか? –

答えて

3

あなたはdeffinately ExecutorServiceの使用を検討してください。すべてのプロセッサがピークに達し、オペレーティングシステムがスレッドコンテキストの切り替えに多くの時間を費やすまで、より多くのスレッドで達成できる並行性は非常に限られています。

実行中のスレッドの数を常に50個に制限すると、全体的なスループットが向上します。

あなたはこのようにそれを試すことができます。

ExecutorService executor = Executors.newFixedThreadPool(50); 

public void sendEmail(final String subject, final String recipient, final ModelMap mm, final String emailTemplate, final String from) { 
MimeMessagePreparator preparator = new MimeMessagePreparator() { 
     // rest of your mail building logic 
     }; 

    executor.submit(preparator); 

} 
関連する問題