Async Java Mail Sender not sends all mails

141 views Asked by At

I have a Spring MVC web Application with have to send mails for a lot of user actions which, at the first time, was made by a synchronous method.

If i make many actions (4-5) on sequence, the mail sender is not sending all mails but only some. I've tried with an @Async method but same result.

My method:

       @Async
   public Future<String> sendMail(MailParametersTO mailParams, MailTypeEnum type) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            message.setSubject(mailUtils.getMailSubject(mailParams.getSubjectParams(), type));
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(from);
            helper.setCc(mailParams.getCc().toArray(new String[0])); 
            helper.setTo(mailParams.getTo().toArray(new String[0]));
            helper.setText(mailUtils.getMailBody(mailParams.getBodyParams(), mailParams.getLink(), type), true);
         Thread.sleep(30000);
            mailSender.send(message);
        } catch (Exception e) {
         e.printStackTrace();
         return new AsyncResult<>("ERROR");
        }
      return new AsyncResult<>("OK");
    }   

Async configuration:

@Configuration
@EnableAsync(proxyTargetClass = true)
@EnableScheduling
public class AsyncConfig implements SchedulingConfigurer, AsyncConfigurer {

   @Bean
   public ThreadPoolTaskScheduler taskScheduler() {
      ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
      scheduler.setPoolSize(2);
      scheduler.setThreadNamePrefix("task-");
      scheduler.setAwaitTerminationSeconds(1200); // 20 minutes
      scheduler.setWaitForTasksToCompleteOnShutdown(true);
      return scheduler;
   }

   @Override
   public Executor getAsyncExecutor() {
      return this.taskScheduler();
   }

   @Override
   public void configureTasks(ScheduledTaskRegistrar registrar) {
      TaskScheduler scheduler = this.taskScheduler();
      registrar.setTaskScheduler(scheduler);
   }

   @Override
   public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
      return new SimpleAsyncUncaughtExceptionHandler();
   }
}

Anyone can help?

0

There are 0 answers