3

JavaMailSenderが二重または三重のメッセージを送信するという問題があります。

コントローラーで:

while(size > 0) //# of emails I want to send, for example 5
{
    Item item= itemRepository.findFirstBySentFalseAndValidTrue(); //getting only emails that are not sent!
    item.getData(); // API call that adds some info to the item, takes between 5-15 seconds per item    
    if(item.isValid())
    {

            item.setHeaderName(dataService.setHeader(item.getStore(), LocaleContextHolder.getLocale()));
            item.setAddress(dataService.getAddress(item.getStore(), LocaleContextHolder.getLocale()) + item.getId());

            String email = dataService.getEmail(item.getStore());
            String footer = dataService.getFooter(item.getStore(), LocaleContextHolder.getLocale());

            if(!item.isSent()) //I check if sent here but still get double messages!
            {
                if(mailSenderService.sendEmail(item, "emails/templates/item", email, footer))
                {
                    item.setSent(true);
                }
            }

    itemRepository.save(item);
    size--;
    }
}

私のメール送信サービスクラスでは:

    final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
    final MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true, "UTF-8");

    Context ctx =  new Context(LocaleContextHolder.getLocale());
    message.setFrom(email);
    message.setTo("test@gmail.com");

    ResourceBundle labels = ResourceBundle.getBundle("messages", LocaleContextHolder.getLocale());
    mimeMessage.setHeader("Content-Type", encodingOptions);
    mimeMessage.setSubject(labels.getString("email.itme.title"), "UTF-8");


    ctx.setVariable("data", item);
    ctx.setVariable("footer", footer);

    try{        
        String processedTemplate =  templateEngine.process(template, ctx);
        mimeMessage.setContent(processedTemplate, encodingOptions);
        this.mailSender.send(mimeMessage);

    } catch(Exception e){
      e.printStackTrace();
    }

    return true;
}

メール送信クラスの問題だと思いますが、API 呼び出しが遅すぎて、メソッドの実行に時間がかかりすぎてメッセージが重複して送信されるのではないでしょうか? 場合によっては、送信する電子メールの数が少ない場合 (たとえば 3 つ) は問題なく、重複して送信されることはありません。20 や 30 のように送信したい場合、すべてに約 15 分かかり、重複が発生します (API の応答時間を制御できません。より高速な場合もあれば、非常に遅い場合もあります)。それをデバッグして、いつどのメソッドが呼び出され、なぜこれらの重複が発生するのかを確認する方法はありますか?

編集:それは私のitemRepository実装です:

 @Repository
 @Qualifier(value = "itemRepository")
 @Transactional
 public interface itemRepository extends CrudRepository<Item, Long> {

 public Item save(Item item);
 public Item findFirstBySentFalseAndValidTrue();
 }
4

1 に答える 1

0

この部分:

while(size > 0) //# of emails I want to send, for example 5
{
    Item item= itemRepository.findFirstBySentFalseAndValidTrue(); //getting only emails that are not sent!

意味がありません。送信するメールの静的な数を指定してから、この値を決して減らさずに、送信されていないメールをリポジトリから 1 つ呼び出して、それを処理します。これは悪い設計です。レコードを更新する前に、プログラムがこのコード行で同じレコードを繰り返し取得することを妨げるものは何もないため、重複が発生する可能性がありますItem item= itemRepository.findFirstBySentFalseAndValidTrue();

代わりに、いくつかの基準に一致する未送信の電子メールのリストをリポジトリにクエリし、返されたこのリストに対してループを実行して電子メールを送信し、リポジトリ内のレコードを更新する必要があります。

于 2015-07-20T13:22:02.333 に答える