Galera,
Estou com o seguinte problema nas minhas Thrads.
Inicia a minha aplicação
PonteEntreThread ponteEntreThread = new PonteEntreThread();
ServidorDoGerenteDeEquipamento servidorDoGerenteDeEquipamento = new ServidorDoGerenteDeEquipamento(new Integer(mileSegundosGerenciaSocket), ponteEntreThread);
Thread thread = new Thread(servidorDoGerenteDeEquipamento);
thread.start();
//Criar o servidor de socket aqui
SViasLogger.logInfo(">> Subindo servidor socket");
String porta = LerProperties.getValor("porta_servidor_gatway");
SViasLogger.logInfo(">>Servidor socket ouvindo na porta: " + porta);
ServerSocket serverSocket = new ServerSocket(new Integer(porta));
SViasLogger.logInfo(">> Servidor aguardando conexão.");
while (true) {
Socket socket = serverSocket.accept();
SViasLogger.logInfo(">> Mais um equipamento atendido.");
try {
ServidorSocket servidorSocket = new ServidorSocket(ponteEntreThread, socket);
Thread thread2 = new Thread(servidorSocket);
thread2.start();
} catch (Exception e) {
SViasLogger.logError("Principal-main", e);
}
}
Classe que gerencia os equipamentos conectados - essa que é o PROBLEMA, jaja vou explicar.
public class ServidorDoGerenteDeEquipamento implements Runnable {
private PonteEntreThread ponteEntreThread;
private long tempoDoSleep;
public ServidorDoGerenteDeEquipamento(long tempo, PonteEntreThread ponte) {
ponteEntreThread = ponte;
tempoDoSleep = tempo;
}
private void gerenciarConexoesDosEquipamentos() {
SViasLogger.logInfo(">> Aguardando Trabalho!");
List<SocketSVias> listaSocketSVias = Collections.synchronizedList(new ArrayList<SocketSVias>(ponteEntreThread.pegarListaDeSocketSVias()));
SViasLogger.logInfo(">> Pegando Lista de Conexoes. Tamanho da Lista: " + listaSocketSVias.size());
synchronized (listaSocketSVias) {
for (SocketSVias socketSVias : listaSocketSVias) {
GerenciaSocket gerenciaSocket = new GerenciaSocket(socketSVias);
Thread thread = new Thread(gerenciaSocket);
thread.start();
}
}
}
public void run() {
while (true) {
try {
gerenciarConexoesDosEquipamentos();
Thread.sleep(tempoDoSleep);
} catch (Exception e) {
SViasLogger.logError("ServidorDoGerenteDeEquipamento-run", e);
}
}
}
}
Classe que pega os meus equipamentos que conectaram e faz uma primeira validação dos equipamentos.
public class ServidorSocket implements Runnable {
private PonteEntreThread ponteEntreThread;
private Socket socket;
public ServidorSocket(PonteEntreThread pet, Socket s) {
ponteEntreThread = pet;
socket = s;
}
private void servidorSocket() throws SViasException, InterruptedException, IOException {
SViasLogger.logInfo(">>Equipamento Conectado, buscando os primeiros dados do equipamento.");
String dadosRecebidosDoEquipamento = lerOsDadosDoEquipamentoConectado(socket);
SViasLogger.logInfo(">>Dados do equipamento conectado:" + dadosRecebidosDoEquipamento);
String imei = EquipamentoUtil.adquiriImeiEquipamentoConectado(dadosRecebidosDoEquipamento);
if ("".equalsIgnoreCase(imei)) {
return;
}
SViasLogger.logInfo(">>Equipamento de imei: " + imei + " conectado no servidor.");
SocketSVias socketSVias = new SocketSVias(socket, "semcomando", imei);
//buscar lista de equipamentos
List<SocketSVias> lista = ponteEntreThread.pegarListaDeSocketSVias();
if (lista.contains(socketSVias)) {
SViasLogger.logInfo(">>Equipamento de imei: " + imei + " sendo validado, removido e inserido novamente na lista");
int index = lista.indexOf(socketSVias);
lista.remove(index);
lista.add(socketSVias);
} else {
SViasLogger.logInfo(">>Equipamento de imei: " + imei + " sendo inserido na lista");
lista.add(socketSVias);
}
SViasLogger.logInfo(">>Equipamento de imei: " + imei + " Validado na lista.");
}
public void run() {
try {
servidorSocket();
} catch (Exception ex) {
SViasLogger.logError("ServidorSocket-run", ex);
}
}
private String lerOsDadosDoEquipamentoConectado(Socket cliente) throws SViasException, IOException {
InputStream in = null;
in = cliente.getInputStream();
byte[] buffer = new byte[1024];
int i = in.read(buffer);
String retorno = new String(buffer);
return retorno;
}
}
por fim tenho uma classe que denominei PonteEntreThread, essa classe possui uma lista dos equipamentos que estao conectados na minha aplicação.
public class PonteEntreThread {
private List<SocketSVias> lista = new ArrayList<SocketSVias>();
public synchronized List<SocketSVias> pegarListaDeSocketSVias() {
return lista;
}
public synchronized void setarEquipamentosConectados(SocketSVias socketSVias) {
lista.add(socketSVias);
}
}
Entao galera, a classe ServidorDoGerenteDeEquipamento do nada para de funcionar, as outras thread’s continuam funcionando normalmente, ja esse cara que eu citei para de funcionar, não da erro, nada, simplesmente para.
O meu aplicativo esta em testes no cliente, fica no maximo 2 dias sem ser preciso reiniciar, passa um periodo maior ocorre o erro acima.
Onde estou errando nessas logicas minha?
Att