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 ).
Gostaria de saber se o ideal é usar :
http://vraptor.caelum.com.br/pt/cookbook/job-scheduling-com-vraptor3-e-spring/
Ou tem alguma forma mais simples de fazer isto?
Preciso:
1- ao iniciar o vraptor , iniciar esta thread
2- mandar comandos para a thread para enviar e-mail ( durante um request )
dá uma olhada nesse plugin:
ele deve ser o suficiente pra vc.
Grande Lucas! No link tem toda a informação e exemplo que preciso, vou baixar o plugin.
Muito obrigado!
Só para complementar a solução, a quem precisar:
Pré-Requisito:
jar do plugin ( e suas dependências ), no caso precisei também do Quartz (http://quartz-scheduler.org/downloads/catalog)
https://github.com/wpivotto/vraptor-tasks/downloads
//classe para facilitar a utilização na fila
public class Email {
private String mensagem;
private String titulo;
private List<Usuario> destinatario;
private List<Usuario> responderA;
private String assunto;
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public List<Usuario> getDestinatario() {
return destinatario;
}
public void setDestinatario(List<Usuario> destinatario) {
this.destinatario = destinatario;
}
public List<Usuario> getResponderA() {
return responderA;
}
public void setResponderA(List<Usuario> responderA) {
this.responderA = responderA;
}
public String getAssunto() {
return assunto;
}
public void setAssunto(String assunto) {
this.assunto = assunto;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
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)
public class EnviarEmails implements Task {
private Queue<Email> filaEmail;
public EnviarEmails() {
filaEmail = new LinkedList<Email>();
}
public void execute() {
try {
//envia emails enquanto tiver pendentes
while(!filaEmail.isEmpty()) {
// Remove email da fila
Email email = filaEmail.poll();
//função estática de envio de emails, tenta enviar...
EmailUtil.enviaEmail(email);
}
} catch (EmailException e) {
e.printStackTrace();
}
}
// função para incluir email na fila
public void addEmail(Email novo) {
this.filaEmail.add(novo);
}
}
No controller:
@Resource
public class MeuController {
//String retorna instancia quando necessário
@Autowired
private EnviarEmails taskEmail;
..
@Get("/meu/finalizar/{idavaliacao}")
public void finalizar(int idavaliacao) {
...
Email novo = new Email();
novo.setAssunto("Resultado enviado");
novo.setTitulo("Resultado enviado para o coordenador:");
novo.setDestinatario(destinos);
novo.setMensagem(mensagem);
//adiciona na task o novo email
taskEmail.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!