ViniGodoy,
A historia é longa, mas vamos la.
Tenho que fazer um sistema que mantenha equipamentos de rastreamentos conectados. Esses equipamentos funcionam de duas maneiras:
Primeira: Trata a conexao que recebe os dados da posição do veiculo e telemetria do veiculo, ate esse ponto blza, por que quando termina a trasmissao dos dados eu fecho o socket e quando e equipamento quiser conectar de novo o servidor vai estar a disposição, sem problemas essa primeira parte.
Segunda: Trata da conexao que a empresa fabricante do equipamento mantem com os equipamentos. É preciso desse canal de conexao para quando a empresa dos equipamentos quiser um equipamento online ele esteja. Entendeu?
O fluxo é o seguinte:
O equipamento conecta no servidor de manutenção.
Pego a string de conexao que o equipamento me manda.
Identifico o equipamento na base.
equipamento identificado mando um @ para que o mesmo fique em “standy by” mas conectado ao meu servidor, para que quando eu quiser mandar algum comando para ele, ele esteja online.
Equipamento fica no maximo 30 minutos conectado, passado esse tempo desconecto e mando ele conectar novamente.
O que eu fiz:
Equipamento conecta no servidor de manutenção.
Faço a validação do equipamento em uma Thread separada, equipamento ok na base eu guardo ele em um Map, nesse caso eu guardo o SocketChannel dentro do meu Map, usando o IMEI do equipamento como Chave, Thread morre.
Tenho uma outra parte do sistema que fica verificando no Map se ha algum comando para o equipamento.
Se caso o equipamento desconectar eu tiro o antigo do Map e adiciono o novo SocketChannel no Map.
Quais os problemas que estou tendo:
Primeiro
06/12/2011 07:34:09,005 32092830 [main] ERROR root - Principal-mainjava.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
at java.net.ServerSocket.implAccept(ServerSocket.java:462)
at java.net.ServerSocket.accept(ServerSocket.java:430)
at br.com.ces.svias.principal.Principal.main(Principal.java:68)
o que já Fiz: Já aumentei o limite de conexao do linux e nada, continua com o mesmo problema.
Segundo, mesmo antes de dar o problema acima, quando mando algum comando para o equipamento que esta dentro do Map, a conexao dele esta perdida, ai tenho que esperar o equipamento conectar novamente e acesso a minha base para mandar comandos pendentes para o equipamento.
O cliente esta no meu pé para que o sistema fique pronto.
Eu testei o sistema da seguinte maneira, quando o equimamento conectar eu crio uma Thread para ele, eu testei sem conexão com o banco, foi criado todas as threads que eu necessitei, aproximadamente 8000 equipamentos, quando coloquei a minha aplicação acessando o banco é que começou o erro:“unable to create new native thread”.
Sei que a criação de Threads não é o ideal, mas não sei mais o que fazer.
Com relação ao banco estou usando C3PO para gerenciar o pool de conexao.
Outra coisa, o meu sistema é 32 bits, no caso estou usando Ubuntu, estou montando outra maquina 64 bits.
Att