é o seguinte…preciso criar um servlet que ficará ouvindo a uma porta para executar uma ação.
Pensei em criar esse load on startup mas só que o startup do servidor web pára pra execução do Servlet. COmo o servlet nunca termina, o servidor nunca sobe.
COmo resolvo isso? Existe outra forma melhor de fazer?
ahh… o cliente descartou a possibilidade de colocar o processo no agendador do SO.
existe um sistema que tem uma porta para o envio de dados para aprovação.
quando o dado é aprovado, essa resposta vem por uma outra porta. ou seja pode ser em 1 min do envio ou uma semana.
entao eu preciso de um processo(listener) para ficar ouvindo essa porta e atualizando essas respostas no banco de dados. Sendo que, o cliente nao quer nada no crontab e, por isso, pensei em fazer com o servlet ao startar o tomcat. mas ai acontece o descrito acima. o servlet nunca é destruido e, portanto, o tomcat nunca termina de tentar inicializar.
tentei chamar uma thread com esse servlet mas tbm nao adiantou.
conseguiu compreender?
R
raf4ever
blz…é o seguinte:
existe um sistema que tem uma porta para o envio de dados para aprovação.
quando o dado é aprovado, essa resposta vem por uma outra porta. ou seja pode ser em 1 min do envio ou uma semana.
entao eu preciso de um processo(listener) para ficar ouvindo essa porta e atualizando essas respostas no banco de dados. Sendo que, o cliente nao quer nada no crontab e, por isso, pensei em fazer com o servlet ao startar o tomcat. mas ai acontece o descrito acima. o servlet nunca é destruido e, portanto, o tomcat nunca termina de tentar inicializar.
tentei chamar uma thread com esse servlet mas tbm nao adiantou.
conseguiu compreender?
O seria essa “porta”?
rafachies
Neste caso o mais apropriado seria criar um listener, como o demosntrado abaixo:
Repare que o listener em si não fará o trabalho de ficar escutando a porta. Ele apenas chama a classe responsável por esta escuta em outra thread. Isto porque um listener deve terminar toda sua execução para que o processo de subida do container termine com sucesso.
A classe abaixo seria o ponto onde você iria escutar a tal porta que deseja:
publicclassClassseQueVaiOuvirPortaimplementsRunnable{@Overridepublicvoidrun(){// coloque aqui seu código para abrir e escutar a porta desejada }}
Para configurar o seu listenr, apenas declare-o no web.xml:
Repare que o listener em si não fará o trabalho de ficar escutando a porta. Ele apenas chama a classe responsável por esta escuta em outra thread. Isto porque um listener deve terminar toda sua execução para que o processo de subida do container termine com sucesso.
A classe abaixo seria o ponto onde você iria escutar a tal porta que deseja:
publicclassClassseQueVaiOuvirPortaimplementsRunnable{@Overridepublicvoidrun(){// coloque aqui seu código para abrir e escutar a porta desejada }}
Para configurar o seu listenr, apenas declare-o no web.xml:
Show rafachies....era isso mesmo que eu precisava..... eu ja até tinha a thread pronta... entao foi só configurar o listener, que ainda nao conhecia..... muito obrigado .
:D
L
Leonardo3001
Desculpa se a pergunta é meio óbvia: você está ou não está usando uma Thread separada para ouvir esta “porta”?
A
adm220
Leonardo3001:
Desculpa se a pergunta é meio óbvia: você está ou não está usando uma Thread separada para ouvir esta “porta”?
Estou usando sim…mas acho que estava usando errado… nao estava chamando Thread t = new Thread(classe). eu estava criando uma instancia da classe que executa e chamando classe.run(); … eu nunca tinha usado thread. Acho que esse foi o maior impacto, mas eu acabei trocando o Servlet com load on star e usando listener.
não sei se usando o Servlet chamando o thread desta forma funcionaria.
rafachies
Só completando adm220, funcionaria normalmente com o load on startup de um servlet. Mas a solução mais elegante é utilizar um listener neste caso, na verdade ele é feito para isso : o).