BUG | Solução | InetAddress.isReachable(3000)

Olá pessoal!!

Alguns dias atrás precisei conectar em um banco de dados e utilizei o DBJMIN (algum tempo atrás postei sobre o projeto) . Infelizmente não consegui conectar ao banco de dados, utilizando windows por que dizia que o banco de dados estava sem conexão.

Pensei: “Impossivel se estou utilizando ele dentro da aplicação”.

Outra tentativa foi verificar se o servidor de banco de dados estava Alive, executando um ping no windows:

 


ping -n 1 -w 3000 ip_server

Resposta: Request timed out.

Após um tempo debugando o DBJMIN descobri que o problema estava no InetAddress.isReachable(3000) este método retornava false, ou seja, ele dizia que o banco de dados estava down quando na verdade ele estava up.

 


InetAddress address = InetAddress.getByName(host);
 ret = address.isReachable(3000);

O BUG Windows/J2SE5

Fonte:  Ohio State Route shield, made to the specifications existing photos found on [Dan Garnell’s http://www.state-ends.com/ohio/ Ohio Highway Ends].Surgiu o seguinte questionamento: O banco está down, Como assim?

Comecei a estudar um pouco mais este bug e descobri algumas coisas interessantes, primeiro resolvi ler a RFC862. Na realidade descobri que Unix Like  implementa ICMP (ping), já o Windows não suporta a RFC862 que é o TCP Based Echo Service (TCP port 7). Embora toda a documentação que li do Windows ele diz suportar.1

Segundo Simone Bordet:

“Windows, as strange as it seems, does not officially support an ICMP “ping” system call. The J2SE 5 implementation hence tries to open a TCP socket on port 7 (the echo service) and hopes to get some sort of reply.”

E em java como ele abre a port 7 do windows tentando recriar o ICMP não é possivel utilizar o método retornando false.

Existe 2 bugs abertos :

4727550 (Will not fix), 5061568

 

Solução

Havia criado uma solução temporária para o meu problema inclusive nada elegante, mas após conversar com meu amigo Ricardo F. Sales (@rfsales) sobre este BUG ele  mencionou que para verificar um caso deste ele usaria: Telnet.

Por que?

“Com o ping conseguiriamos verificar se o host está respondendo, mas existem casos que por motivos de segurança a resposta de ping é bloqueado no firewall.
Portanto como estamos falando a nível de aplicação precisamos testar se a porta do serviço está funcionando, ou seja, com um simples telnet no numero da porta resolveria.
Em outras palavras não necessáriamente precisamos saber se o host está pingando e sim se a porta do banco de dados naquele host esta up.” – @rfsales

Foi ai que me lembrei do ServerSocket em java, que o  mesmo verificaria a porta e se amesma estive-se ativa então se conectaria.

Muito obrigado Ricardo.

Funcionou!!!

Para verificar a implementação acesse: Revisão 138

 

DBJMIN Download

E já pode ser testada a nova versão do DBJMIN-05 RC 3. Além de adicionar a solução a este bug, possui a opção de acessar o banco de dados utilizando DESKTOP (D) ou então WEB(W). DBJMIN implementa Jetty.

Download: DBJMIN-05_RC3

Documentação: DBJMIN-Step_by_Step.pdf

Se desejar colaborar com o projeto (Inclusive está rolando a discussão sobre o assunto) acesse: DBJMIN Group

 

*Todo comentário é bem vindo..

 

Referências:

1 -RFC862 –  http://support.microsoft.com/kb/832017/pt-br

2- Entenda TCP port  7  – http://www.auditmypc.com/port/tcp-port-7.asp


2 thoughts on “BUG | Solução | InetAddress.isReachable(3000)

    1. Hhaha!!
      Gabriotti,
      Obrigado pelo comments (Pessoal este cara conhece muito) inclusive vc precisa sair de @home e aparecer por aqui para conversarmos um pouco.

      Abraço

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s