Problemas com Channels - DESESPERO TOTAL

15 respostas
vcsmetallica

Galera,

Estou usando o Java NIO para realizar a cominicação com os meus equipamentos.

So que de vez em quando é lançado a seguinte excessao:

java.nio.channels.ClosedSelectorException
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:66)
        at sun.nio.ch.SelectorImpl.selectNow(SelectorImpl.java:88)
        at sun.nio.ch.Util.releaseTemporarySelector(Util.java:135)
        at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:118)

Alguem sabe o que pode levar a esse erro?

A parte do codigo que lança o erro:

private String lerOsDadosDoEquipamentoConectado(Socket cliente) throws  IOException {
        InputStream in = null;
        in = cliente.getInputStream();
        byte[] buffer = new byte[1024];
        int i = in.read(buffer);
        String retorno = new String(buffer);
        if (retorno != null && !retorno.isEmpty()) {
            return retorno.trim();
        }
        return retorno;

    }

Att

15 Respostas

vcsmetallica

Galera,

Outro problema que estoou tento é esse:

java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:145)
at br.com.ces.svias.principal.Principal.main(Principal.java:70)

Ja tentei varias coisas:

Aumentei o número de conexão do Linux;
Já coloquei o java iniciar como -server

E nada, já não sei mais o que eu faço.

Outra coisa, não estou manipulando nenhum arquivo.

Pelo Amor de Deus, alguem sabe o pq desses erros?

Att

ganondorfan

No seu código tem o método que utiliza o socket entretanto não tem o método que faz a conexão do mesmo.

O erro do tooMany deve ser porque você está abrindo muitos recursos e não está fechando eles.

vcsmetallica

Essa parte eu não entendi muito bem.

Att

ganondorfan

Você postou os erros, ok, porém este método que você postou, ele utiliza do socket para leitura (o que recebe como argumento), o mais provável é que este socket esteja fechado em algum momento da sua aplicação.

Posta o código que controla a abertura e o fechamento dele.

vcsmetallica

Ai é que “tá”!

Vou te explicar a situação:

Tenho que conectar no meu sistema mais de 5000 equipamentos de rastreamento de veiculos.
O problema é eu não posso fechar a conexao dos equipamentos, por motivo de gasto de envio e recebimento de informações, por que eles usam chips de telefonia e isso fica caro.

Eu pego o equipamento que conectou e armazeno o socket dele em um HashMap.

Quando eu uso o socket.isClosed() ele sempre me retorna false e quando eu uso o socket.isConnected() ele sempre me retorna true, Estou te falando isso pq eu tenho um equipamento de teste. Cara, ja cheguei a desligar o equipamento e os status que eu sitei acima não muda. Devo estar pecando nessa situação.

Att

E

O uso de channels não ajuda a diminuir o número de sockets; ele ajuda a diminuir o número de threads necessárias para rodar um servidor.
Se você precisa aumentar o número de sockets no Linux, procure por “increase socket number Linux” na Internet.

vcsmetallica

entanglement:
O uso de channels não ajuda a diminuir o número de sockets; ele ajuda a diminuir o número de threads necessárias para rodar um servidor.
Se você precisa aumentar o número de sockets no Linux, procure por “increase socket number Linux” na Internet.

Ja fiz algo parecido:

http://www.thiagovespa.com.br/blog/2011/01/19/muitos-arquivos-abertos/

Mesmo assim nao adiantou

Att

vcsmetallica

vcsmetallica:
Galera,

Outro problema que estoou tento é esse:

java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:145)
at br.com.ces.svias.principal.Principal.main(Principal.java:70)

Ja tentei varias coisas:

Aumentei o número de conexão do Linux;
Já coloquei o java iniciar como -server

E nada, já não sei mais o que eu faço.

Outra coisa, não estou manipulando nenhum arquivo.

Pelo Amor de Deus, alguem sabe o pq desses erros?

Att

Galera,

Abaixo o codigo que esta gerando esse erro:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
 serverSocketChannel.socket().bind(new InetSocketAddress(new Integer(porta)));

  while (true) {
                try {
                    SocketChannel socketChannel = serverSocketChannel.accept(); //Linha 70
                    Socket socket = socketChannel.socket();
                    ServidorSocket servidorSocket = new ServidorSocket(ponteEntreThread, socket);
                    executor.execute(servidorSocket);
                } catch (Exception e) {
                    Logger.logError("Principal-main", e);
                } catch (Throwable t) {
                    Logger.logError("Principal-main", t);
                }
            }

Justamente essa linha que esta me deixando doido!

SocketChannel socketChannel = serverSocketChannel.accept(); //Linha 70
vcsmetallica

Galera,

Por tudo que é mais sagrado, eu já fiz de tudo no meu projeto e no ambiente que vai ficar o projeto.

Fiz o que manda esse tutorial e nada.
http://www.thiagovespa.com.br/blog/2011/01/19/muitos-arquivos-abertos/

Já não sei mais o que fazer!

Preciso entregar o aplicativo urgentemente para o cliente e somente isso esta agarrando.

Apliquei o seguinte comando no linux e ele me retorno as seguintes informações:

debiansvias:~# ulimit -a


core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 12479
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 60000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 60000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Att

vcsmetallica

Galera,

Essa maquina virtual do Linux esta em cima de um Windows 2003. Será que isso pode influenciar no numero de Conexoes?

Att

E

Que eu saiba não. É melhor verificar se você está fechando adequadamente os sockets, quando suas conexões caem por algum motivo. Cada socket que você larga aberto gasta um descritor de arquivo e isso pode acabar dando problemas.

vcsmetallica

Mas eu modifiquei os arquivos para conectar 60000.
Não esta conectando nem 4020 equipamentos.

Att

vcsmetallica

Galera,

Eu estou fechando as conexoes, ja alterei as configurações de sistema operacional, ja fiz ate promessa e nada.

Por favor me ajudem.

Att

E

vcsmetallica:
Galera,

Essa maquina virtual do Linux esta em cima de um Windows 2003. Será que isso pode influenciar no numero de Conexoes?

Att

Seria possível você testar o seu programa em uma máquina de verdade (não uma máquina virtual)? Vai que o software de máquinas virtuais que você está usando no Windows 2003 fique inspecionando as conexões e limitando artificialmente a quantidade de conexões para reforçar algum limite (por exemplo, “dependendo da licença o Windows 2003 que você tem só pode aceitar 4000 conexões” ou sei lá que coisa que pode ocorrer). Veja se é possível arranjar uma máquina qualquer, só para ver se é isso mesmo.

vcsmetallica

Vou ter que fazer isso.

Nao estou aguentando isso mais nao

Att

Criado 25 de setembro de 2011
Ultima resposta 3 de out. de 2011
Respostas 15
Participantes 3