Problema com JavaMail

4 respostas
alxdre.pestana

Pessoal, bom dia!

Estou com um problema na minha aplicação que recebe xml através do JavaMail.

A aplicação funciona por algum tempo, digamos até por um mes dependendo a conexão…
Se por acaso o LINK COM O SERVIDOR DE E-MAIL cair no momento em que está executando o método

getSubject() ou getCount()

A aplicação fica travada e não acontece nenhum exception…
Simplesmente trava, fica dias e eu tenho que encerrar a aplicação e executar novamente.

Para tentar amenizar o erro, tentei colocar um método para checar a conexão antes de utilizar estes métodos, mas parece que é a lei de murphy e não o LINK cai depois de alguns dias bem no momento que está executando o método.

if(conexaoServidorEMail()){
	//Pegando o assunto da mensagem
	this.subject = messages[i].getSubject();
}else{
               break for1;
}

Alguém tem alguma idéia o que eu posso fazer ou substituir estes trechos?

//Acessando diretorio de entrada INBOX
				if(getPastaCaixaEntrada(this.cxEntrada)){
					
					//Verificando a quantidade de mensagens disponiveis na caixa postal
					int qtdMsg = this.folder.getMessageCount();
					
					//Se existir mensagens
					if(qtdMsg > 0){
						
						logger.info("====================================");
						logger.info("Mensagem na Caixa Postal identificada");
						logger.info("===================================");
						
						//Filtrando as mensagens em um Array
						this.messages = this.folder.getMessages(); 
						
						//Faça enquanto existir mensagens
						for1: for(int i=0; i < qtdMsg; i++){
							
							//Numero da Mensagem
							int numMsg = messages[i].getMessageNumber();
							logger.info("> Mensagem Número: "+numMsg);
							
							
							//Verificar novamente a conexão com o servidor de email devido o método não continuar
							if(conexaoServidorEMail()){
								//Pegando o assunto da mensagem
								this.subject = messages[i].getSubject();
							}else{
								break for1;
							}
								
							//Listando o(s) remetentes da mensagem
							this.sender = messages[i].getFrom();
							
							for(Address addFrom : sender){
								String from = addFrom.toString();
								
								int ini = from.indexOf("<");
								int fim = from.indexOf(">");
								if(fim > 0 ){
									logger.info("From: "+from.substring(ini+1,fim));
								}else{
									logger.info("From: "+from);
								}
							}
						
							
							//Armazenando o conteudo na mensagem em um objeto
							msgObj = messages[i].getContent();
							
							//Verificando se está intanciado em MultiPart
							if (msgObj instanceof Multipart) {
								//Pegando as partes da mensagem
								this.multipart =  (Multipart) messages[i].getContent();

								//Quantidade de anexos
								int qtdPartes = 0;
								//Verificar novamente a conexão com o servidor de email devido o método não continuar
								if(conexaoServidorEMail()){
									qtdPartes = this.multipart.getCount(); 
								}else{
									break for1;
								}
								logger.info("Quantidade de anexos: "+qtdPartes);							
								for(int y=0; y < qtdPartes; y++){
									//Pegando as partes da mensagem
									this.part = this.multipart.getBodyPart(y);
									
									//Pegando o TIPO
									this.contentType = this.part.getContentType();
									
									//System.out.println("ContentTYPE: "+contentType);
									if (this.contentType.startsWith("text/plain")){
										//Imprimir a mensagem
										//System.out.println(part.getContent().toString());
									}	
									
									//Pegando nome do arquivo
									String anexo = this.part.getFileName();
									
									//Validação para verificar se o arquivo é um XML
									if(anexo != null){
										if(validarXML(this.part)){
											logger.info("Arquivo XML identificado: "+this.part.getFileName().replace("/", "_").replace("\\", "-"));
											//Salvando arquivo XML
											salvarArquivo(this.part);
										}
									}
								}
								
								//Excluindo mensagem
								messages[i].setFlag(Flags.Flag.DELETED, true);
								logger.info("Mensagem deletada do servidor!");
								
								//Processar 10 mensagens por vez
								if(qtdMsg > 10 && i >= 9) break for1;
								
								
							}else{
								//Mensagem não possui MultiPart - Somente TEXTO
								//Excluir mensagem
								messages[i].setFlag(Flags.Flag.DELETED, true);
								logger.info("Mensagem deletada do servidor!");
								
								//Processar 10 mensagens por vez
								if(qtdMsg > 10 && i >= 9) break for1;
							}
					
							
						}

Obrigado a todos!

4 Respostas

alxdre.pestana

Pessoal jah aconteceu isso com vocês?

Porque não lança exception o JAVAMAIL?

eu simulei colocando o Thread.Sleep de 5 segundos e tirei o cabo de rede da maquina…
e realmente, quando ele chega na hora de executar o método getSubject() ou getCount() não acontece nada, fica parado a thread e não lança exception…

gcoletaalves

Alguem tem a solução? Estou com o mesmo problema aqui.

alxdre.pestana

Fala meu amigo…
Você resgatou este tópico que ninguém me ajudou…

Sabe o que eu fiz para tentar “amenizar” este problema…

Fiz o meu programa em MultiTread.

Onde tenho uma variavel de data que a Tread 1 fica atualizando a cada execução.
Digamos se o programa travar a variavel não será atualizada…

Enquanto isso eu tenho uma outra Thread 2 que fica checando a variavel se a data foi atualizada.
Caso a aplicação esteja travada, ele ira derrubar aquela Thread 1 e iniciar outra nova Thread checando os emails…

Assim começa tudo de novo e controlo se travou ou nao…

gcoletaalves

Vou ver se consigo agui. valew!

Criado 4 de julho de 2011
Ultima resposta 24 de out. de 2012
Respostas 4
Participantes 2