[RESOLVIDO] Vraptor + envio de e-mails em thread separada
3 respostas
estrazulas
Olá,
Desenvolvi função de envio de e-mails usando a lib commons , no entanto preciso que o Envio de e-mails rode em outra thread, pois após a chamada de envio do e-mail a requisição demora a retornar, dando a impressão de estar lento.
Estou pensando em fazer uma fila , no entanto não sei que componente usar para ficar monitorando a fila de tempos e tempos ( em paralelo com os resources que já tenho ).
//classe para facilitar a utilização na filapublicclassEmail{privateStringmensagem;privateStringtitulo;privateList<Usuario>destinatario;privateList<Usuario>responderA;privateStringassunto;publicStringgetMensagem(){returnmensagem;}publicvoidsetMensagem(Stringmensagem){this.mensagem=mensagem;}publicList<Usuario>getDestinatario(){returndestinatario;}publicvoidsetDestinatario(List<Usuario>destinatario){this.destinatario=destinatario;}publicList<Usuario>getResponderA(){returnresponderA;}publicvoidsetResponderA(List<Usuario>responderA){this.responderA=responderA;}publicStringgetAssunto(){returnassunto;}publicvoidsetAssunto(Stringassunto){this.assunto=assunto;}publicStringgetTitulo(){returntitulo;}publicvoidsetTitulo(Stringtitulo){this.titulo=titulo;}}
Task simples para envio de emails:
//para iniciar junto com o vraptor@ApplicationScoped//taxa de verificação de pendencias na fila da task@Scheduled(fixedRate=80000)publicclassEnviarEmailsimplementsTask{privateQueue<Email>filaEmail;publicEnviarEmails(){filaEmail=newLinkedList<Email>();}publicvoidexecute(){try{//envia emails enquanto tiver pendenteswhile(!filaEmail.isEmpty()){// Remove email da filaEmailemail=filaEmail.poll();//função estática de envio de emails, tenta enviar...EmailUtil.enviaEmail(email);}}catch(EmailExceptione){e.printStackTrace();}}// função para incluir email na filapublicvoidaddEmail(Emailnovo){this.filaEmail.add(novo);}}
No controller:
@ResourcepublicclassMeuController{//String retorna instancia quando necessário@AutowiredprivateEnviarEmailstaskEmail;..@Get("/meu/finalizar/{idavaliacao}")publicvoidfinalizar(intidavaliacao){...Emailnovo=newEmail();novo.setAssunto("Resultado enviado");novo.setTitulo("Resultado enviado para o coordenador:");novo.setDestinatario(destinos);novo.setMensagem(mensagem);//adiciona na task o novo emailtaskEmail.addEmail(novo);}
Agradeço novamente ao Lucas, a solução é muito simples com este plugin e tem vários outros tipos de tasks bem uteis!