[Resolvido]Servlet: load-on-startup[/Resolvido]

10 respostas
A

Bom dia galera blz…

é 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.

vlwww… abraço,

10 Respostas

R

Acho que o que você precisa é de um listener

A

Como faço isso?

R

Explica melhor o que você precisa implementar.

A

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?

R

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:

public class YourListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		ClassseQueVaiOuvirPorta classe = new ClassseQueVaiOuvirPorta();
                Thread thread = new Thread(classe);
                 thread.start();
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	}

}

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:

public class ClassseQueVaiOuvirPorta implements Runnable {

	@Override
	public void run() {
	   // coloque aqui seu código para abrir e escutar a porta desejada	
        }

}

Para configurar o seu listenr, apenas declare-o no web.xml:

<listener>
		<listener-class>caminho.completo.do.pacote.YourListener</listener-class>
	</listener>
A
rafachies:
Neste caso o mais apropriado seria criar um listener, como o demosntrado abaixo:
public class YourListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		ClassseQueVaiOuvirPorta classe = new ClassseQueVaiOuvirPorta();
                Thread thread = new Thread(classe);
                 thread.start();
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	}

}

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:

public class ClassseQueVaiOuvirPorta implements Runnable {

	@Override
	public void run() {
	   // coloque aqui seu código para abrir e escutar a porta desejada	
        }

}

Para configurar o seu listenr, apenas declare-o no web.xml:

<listener>
		<listener-class>caminho.completo.do.pacote.YourListener</listener-class>
	</listener>

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

Desculpa se a pergunta é meio óbvia: você está ou não está usando uma Thread separada para ouvir esta “porta”?

A

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).

[]'s

Criado 22 de julho de 2010
Ultima resposta 22 de jul. de 2010
Respostas 10
Participantes 4