Reiniciando o tomcat a classe que envia email só executa uma vez

Ola amigos,
eu botei um init() em um servlet e mandei ele executar quando inicia o tomcat, nesse init() eu coloquei a chamada do método que envia emails.
O problema é que quando o método executa, ou seja, quando inicio o tomcat ele envia só uma vez o email e depois não envia mais os emails quando eu solicito o envio. Tirando essa chamada no init() ele envia emails normalmente mas quando eu coloco essa função para iniciar com o tomcat, não funciona mais.
Função init() que está no servlet é assim

[code]public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException {
super.init(config);
try {

        String msgSubject = "AVISO DO SISTEMA - SCC4";
        String msgConteudo = "<br><br><b>   TESTE</b> ";
        ArrayList<String> listaEmail = new ArrayList<String>();
        int idEmpresa = 24;
        ArrayList<String> emailUs = Rh.controle.contrUsuariossistema.consultaEmailUsuarios(idEmpresa);
        for (int j = 0; j < emailUs.size(); j++) {
            listaEmail.add(emailUs.get(j));
        }
            //chama a funcao que envia o email
            EnviaEmail.sendSimpleMail(msgSubject, listaEmail, msgConteudo);
       
    } catch (Exception es) {
        es.printStackTrace();
    }
}

}[/code]
E a função que envia emails é essa:

[code]
public class EnviaEmail {
public static void sendSimpleMail ( String subject, ArrayList to, String mensagem) throws AddressException {
String mailServer = “mail.orga.com.br”;
String from = “info@scc4.com.br”;
if(to.size() > 0){
try{
Properties props = new Properties();
props.put(“mail.smtp.host”, mailServer);
props.put(“mail.smtp.auth”, “true”);
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
session.setDebug(false);
Message msg = new MimeMessage(session);

           InternetAddress addressFrom = new InternetAddress(from);  
           msg.setFrom(addressFrom);  
           //Email com apenas Um Endereço(Recipient)
           //InternetAddress addressTo = new InternetAddress(to);  
           //msg.setRecipient(Message.RecipientType.TO, addressTo);  
           //Email com Varios Endereços(Recipients)
           InternetAddress[] addressTo = new InternetAddress[to.size()];
           for (int i = 0; i < to.size(); i++) {
                addressTo[i] = new InternetAddress(to.get(i));
            }
           msg.setRecipients(Message.RecipientType.TO, addressTo);
           msg.setSubject(subject);  
           msg.setContent(mensagem, "text/html");  
           Transport.send(msg);  
            
       }  
       catch(SendFailedException ex ){  
           //logs(ex.toString(), ex.getStackTrace(), "Erro ao Enviar Email() ->> TO: " + to + "  FROM: " + from);      
       }  
       catch(MessagingException ex ){  
          //logs(ex.toString(), ex.getStackTrace(), "Erro ao Enviar Email() ->> TO: " + to + "  FROM: " + from);        
       }  
       catch(Exception ex ){  
           JOptionPane.showMessageDialog(null, "ERRO");
           //logs(ex.toString(), ex.getStackTrace(), "Erro ao Enviar Email() ->> TO: " + to + "  FROM: " + from);               
       }  
      }  
   }
   public static class SMTPAuthenticator extends javax.mail.Authenticator{  
    @Override
         public PasswordAuthentication getPasswordAuthentication(){  
          return new PasswordAuthentication("info@scc4.com.br", "xxxxxxxx");
       }  
   }

}[/code]
Se algue puder me dá uma luz,
valeu.

Prq o metodo init é chamado uma unica vez pelo ServletContainer, seu problema seria resolvido se colocasse esse envio de e-mails nos metodos service , doGet ou doPost

Procura saber sobre o ciclo de vida do Servlet, pode ser que isso te explique o porque de ser executado somente uma vez.

ramilani12, para fazer isso no método service() ele não teria que reescrevê-lo? Caso a resposta seja afirmativa, isso não é nem um pouco indicado. O melhor mesmo é fazer como você mesmo disse, utilizar no doGet() ou no doPost().

Abraços,

amigos, obrigado pela resposta.
Mas o problema é que está executando uma vez nessa classe, tudo bem é pra iniciar uma vez mesmo pois coloquei só para executar no inicio do tomcat.
Mas na minha aplicação eu chamo esse metodo de email outras vezes depois dessa classe que tem o init(), e não funciona.
Ele já está em outro servlet e não funciona entenderam?

obrigado

Já experimentou jogar o conteudo do método init() dentro do método doGet() ou doPost()?

[quote=pimenta]Procura saber sobre o ciclo de vida do Servlet, pode ser que isso te explique o porque de ser executado somente uma vez.

ramilani12, para fazer isso no método service() ele não teria que reescrevê-lo? Caso a resposta seja afirmativa, isso não é nem um pouco indicado. O melhor mesmo é fazer como você mesmo disse, utilizar no doGet() ou no doPost().

Abraços,[/quote]

E qndo vc herda da HttpServlet vc não reescreve tbm os métodos doGet e doPost ? :smiley: :smiley:

Mas o service() não é exatamente a mesma coisa que o doGet() e o doPost().
O service() é executado logo após o init() ser terminado com sucesso e é responsável em chamar doGet() ou doPost(). Além disso, pelo que já li reescrever o service() não é indicado.
Em relação a reescrever os métodos doGet() e doPost() eles estão lá para serem reescritos mesmo, diferentemente do service().

oi amigos, eu botei no método get() e não funcionou.
Será que fiz alguma coisa errada?
Não executou o que eu queria fazer.
Sem o init() ele executa?

att,

lançou alguma exceção?

Não apenas não enviou o email.
Fica assim a classe doGet()?

protected void doGet(javax.servlet.ServletConfig config) throws javax.servlet.ServletException{
        //processRequest(request, response);
        super.init(config);
        try {

            String msgSubject = "AVISO DO SISTEMA - SCC4";
            String msgConteudo = "<br><br><b>   TESTE</b> ";
            ArrayList<String> listaEmail = new ArrayList<String>();
            int idEmpresa = 24;
            ArrayList<String> emailUs = Rh.controle.contrUsuariossistema.consultaEmailUsuarios(idEmpresa);
            for (int j = 0; j < emailUs.size(); j++) {
                listaEmail.add(emailUs.get(j));
            }
                //chama a funcao que envia o email
                EnviaEmail.sendSimpleMail(msgSubject, listaEmail, msgConteudo);
           
        } catch (Exception es) {
            es.printStackTrace();
        }
    } 

[quote=rico700]Não apenas não enviou o email.
Fica assim a classe doGet()?

[/quote]

Obviamente vc não sobrescreveu o metodo doGet() veja a sintaxe:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}  	

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}  	

Desculpa a minha ignorancia
mas como assim sobrescrever o método doGet()?

valeu pela ajuda

Vc não está herdando da Classe HttpServlet?
os metodos doGet , doPost , service , doPut, doDelete e etc, vc os implementa conforme a sua necessidade , se vc não os implementou o ServletContainer invoca a implementação default.

veja o javadoc da classe HttpServlet:

http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpServlet.html

resolvi o problema, tentei com a classe listener e deu certo.

valeu ai pela atenção.