2015-10-27 5 views
2

В моем приложении mvc Spring, вызывающем следующий метод, при нажатии кнопки «Сохранить» на странице jsp.Как вызвать метод после завершения первой транзакции весной mvc

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String addUser(@ModelAttribute("user") @Valid User u, 
     BindingResult result, @ModelAttribute("category") UserCategory uc, 
     BindingResult resultCat, Model model, RedirectAttributes reDctModel) { 


      this.userService.addUser(u); // adding new user to DB 
      reDctModel.addFlashAttribute("msgSucess","Successfully saved..!"); 

      this.sendEmail(u.getUsr_email(),"RDMS","Login Details"); // For sending mail 



     return "redirect:/users"; 
    } 


public String sendEmail(String recipientAddress,String subject,String message) { 
     // creates a simple e-mail object 
     SimpleMailMessage email = new SimpleMailMessage(); 
     email.setTo(recipientAddress); 
     email.setSubject(subject); 
     email.setText(message); 

     // sends the e-mail 
     this.mailSender.send(email); 

     return "Result"; 
    } 

Это мой ApplicationContext

</bean> 
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="host" value="smtp.gmail.com" /> 
    <property name="port" value="587" /> 
    <property name="username" value="[email protected]" /> 
    <property name="password" value="********" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.transport.protocol">smtp</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.starttls.enable">true</prop> 
     </props> 
    </property> 
</bean> 

Выпуск, после добавления SendEmail(), она занимает около 15 секунд, чтобы сохранить новый record.Before добавления этого метода принимает только 1 second.Can кто-нибудь поможет мне уменьшить медленность программы или вызвать sendEmail() после завершения первой транзакции. Спасибо заранее.

+1

добавить без Синхронной системы для отправки электронной почты, как очереди сообщений JMS –

+2

вы можете использовать метод SendEmail как асинхронный с использованием весенней аннотации @Async – tcharaf

+1

Но электронная почта будет отправлена, даже если экономия не удалась. –

ответ

0

Вам необходимо создать асинхронную службу и настроить приложение для асинхронного использования, здесь у вас есть spring tutorial. В асинхронной службе вы должны поместить свой код для отправки электронной почты. Ниже вы можете увидеть пример код для 2-х классов, первым это сервис вторым является класс приложения



     import java.util.concurrent.Future; 
     import org.springframework.scheduling.annotation.Async; 
     import org.springframework.scheduling.annotation.AsyncResult; 
     import org.springframework.stereotype.Service; 
     import org.springframework.web.client.RestTemplate; 

     @Service 
     public class SampleService { 

      @Async 
      public Future sendEmail(String email) { 
       // here you can place your code for sending email 
       return new AsyncResult("email sent successful"); 
      } 

     } 



    import java.util.concurrent.Future; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.boot.CommandLineRunner; 
    import org.springframework.boot.SpringApplication; 
    import org.springframework.boot.autoconfigure.SpringBootApplication; 
    import org.springframework.scheduling.annotation.EnableAsync; 

    @SpringBootApplication 
    @EnableAsync 
    public class Application implements CommandLineRunner { 

     @Autowired 
     SampleService sampleService; 

     @Override 
     public void run(String... args) throws Exception { 
      Future page1 = sampleService.sendEmail("[email protected]"); 
      while (!page1.isDone()) { 
       Thread.sleep(10); 
      } 
      System.out.println(page1.get()); 
     } 

     public static void main(String[] args) { 
      SpringApplication.run(Application.class, args); 
     } 
    } 

Смежные вопросы