Pessoal,
Preciso de uma força de vocês.
Acabei de desenvolver uma rotina de envio de email utilizando a API Commons Mail,
porém como já imaginava essa rotina é um pouco demorada e pode causar um certo desconforto ao usuário.
O correto seria tornar essa tarefas assíncrona e prosseguir com o funcionamento da minha aplicação,
pesquisei sobre alternativas e encontrei duas formas que acredito poder resolver meu caso “Threads” / “JMS”,
estou um pouco confuso com relação a estas alternativas, mais o que me pareceu mais viável em termos de curva de aprendizado foi a criação das Threads.
Vocês podem me dar um norte? para este caso Thread seria a melhor solução?.
abraço.
Olá amigo, depende do volume de emails que seriam enviados, imagine enviar 10000 emails onde seriam criadas 10000 Threads?
Mas Thread é util no caso de envio esporadico sim.
Eu optaria em usar JMS se for o caso de alto volume de envio. Sem contar em manter a session da conexao smtp para nao ficar conectadno o tempo todo!
Fica dica.
Te agradeço pela dica, Paulo.
Tem razão, ter uma thread para vários emails não seria o adequado.
Achei um pouco complicado o JMS, sabe como é né quando estamos com prazo apertado é um tanto quanto preocupante correr atrás de algo novo sem saber se temos tempo ou hábil em aprender e entregar o produto a tempo.
Pelo que eu vi o JMS não é limitado apenas para envio de emails.
Você recomenda algo que posso se enquadrar na minha situação?
Obrigado,
Olá
Eu uso TimerTask (no fundo é uma thread) para enviar emails de tempo em tempo.
Foi bem simples de implementar e não precisamos instalar um app server para rodar o aplicativo.
Só teve o problema de que o usuário não recebe o email o quanto antes, ele tem que esperar a thread passar e enviar.
furutani,
realmente parece ser bem simples mesmo, minha dúvida é a seguinte:
Concordo com o ponto de vista do nosso amigo Paulo com relação a varias threads para cada email a ser enviado,
porém se eu encapsular o envio desses emails em um lote (método) e dedicar uma thread para a execução desse metodo.
isso é possivel, não é?
Nesse caso, não teria um email por thread e sim um lote. E nessa situação posso utilizar o Timertask.
Obrigado,
Marcio
Exatamente, o que eu faço é um envio em lote.
Gravo tudo numa tabela e depois eu leio para enviar.
Ótimo amigo, então vou partir dessa linha depois posto o resultado.
valeu pela dica.
Então furutani,
Pelo que percebi, a vantagem do Timertask é a criação de threads por agendamento (muito bacana),
no meu caso preciso apenas que minha rotina de envio de emails seja executada em segundo plano.
Optei por criar uma classe implementando Runnable e trabalhar com Thread diretamente.
Disso tudo ficou uma dúvida:
Quando criamos uma nova Thread dedicada para uma tarefa em segundo plano,
caso o usuário saia da sessão ou feche o Browser, essa Thread continua processando?
Pressuponho que, a partir de seu start() esse processo já esteja sendo gerenciado pela JVM.
Obrigado!!!
Conclusão,
Como já dito anteriormente optei por executar minha rotina de Email utilizando uma Thread dedicada.
o Paulo levantou uma questão importante sobre um possível problema que seria uma Thread por Email (N emails = N Threads),
então fiz o seguinte:
1 - Criei uma Classe implementando Runnable: (se precisar de alguns parametros, Crie um construtor alternativo!!!)
public class ThreadMail implements Runnable {
public void run() {
// Rotina de envio dos Emails
}
}
2 - Instanciei a nova classe e criei um objeto Thread passando-a como parametro: (Ao dar o start seu metodo run() é disparado, então aThread irá executar a rotina)
ThreadMail runnable = new ThreadMail();
Thread thread = new Thread(runnable, "EmailThread");
thread.start();
Obs:.
- Após startar a Thread a JVM irá gerenciar, portanto sua Thread não depende do client para permanecer executando (O usuário pode sair do Browser ou desconectar-se da aplicação que sua Thread continua ativa);
- Após a finalização da rotina do metodo run(), sua Thread é desativada automaticamente;
Obrigado pela força pessoal, Abraço