Connect URL - Connection timed out

Olá!
Tenho uma classe java a correr que se liga a URL e, usando DOM, lê valores de um XML.
A classe está sempre a correr, mas tem acontecido durante a noite a seguinte exception:

java.net.ConnectException: Connection timed out: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(Unknown Source)
        at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at sun.net.NetworkClient.doConnect(Unknown Source)
        at sun.net.www.http.HttpClient.openServer(Unknown Source)
        at sun.net.www.http.HttpClient.openServer(Unknown Source)
        at sun.net.www.http.HttpClient.<init>(Unknown Source)
        at sun.net.www.http.HttpClient.New(Unknown Source)
        at sun.net.www.http.HttpClient.New(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown
Source)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Sour
ce)
        at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown So
urce)
        at java.net.URL.openStream(Unknown Source)

Alguém me dá uma dica pq isto acontece?
Thankx
Cláudia

se for uma chamada web, vc tem condições no container de configurar o timeout da sua aplicação, daí vc aumenta.

mais seria interessante vc fzr um teste de stress, visto que o custo de trabalhar com DOM é alto.

veja se não é possível vc migrar de DOM para SAX, aí verás substanciais melhoras.

[s]
baiano

Não estou a usar nenhum container…

O meu código é o seguinte:

public class matadouro extends Thread {

	/**
	 * @param args
	 * @throws ParserConfigurationException 
	 * @throws SAXException 
	 * @throws RemoteException 
	 */
	public static void main(String[] args) throws ParserConfigurationException, SAXException, RemoteException, InterruptedException {
		// TODO Auto-generated method stub
		
		// Parameters
		String [] data = {null, null, null, null, null};
		
		while(true)
		{
		try {
	 		
			URL url = new URL("http://matadourosbl.no-ip.info/matadouro/data.php");
		 
			InputStream inputXML = url.openStream();
			
			//Declare variables
			org.w3c.dom.Document document;
			javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
		
			//Build document:
			javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
			document = builder.parse(inputXML);

			//Generate the NodeList;
			org.w3c.dom.NodeList nodeList = document.getElementsByTagName("data");
			 				
			for (int i=0; i<nodeList.getLength(); i++)
			{
				org.w3c.dom.Node curNode = nodeList.item(i);
	
				//Get value attribute:
				org.w3c.dom.Element curElm = (org.w3c.dom.Element)nodeList.item(i);
				String curVal = curElm.getAttribute("value");
			

Ninguém me ajuda??
Continuo tento a excepção…

Veja: http://www.guj.com.br/posts/list/52822.java
Lá tem a indicação para trabalhar com requisições http.

Até mais…

Oi nbluis!
Estive a ver o que me indicaste e também li o tutoria http://www.guj.com.br/java.tutorial.artigo.5.1.guj

Então fiquei com uma dúvida… O meu código:

...
URL url = new URL("http://matadourosbl.no-ip.info/matadouro/data.php");
 		 
InputStream inputXML = url.openStream();
...

Será que entre a 1ª linha e a 2ª linha preciso de alguma coisa do tipo:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 connection.setDoInput(true);
 connection.setDoOutput(false);
connection.connect();

Espero tua resposta.
Obrigada!!
Cláudia

Oi Claudia, desculpe a demora…
Pode fazer da seguinte maneira…

URL url = new URL(&quot;http://matadourosbl.no-ip.info/matadouro/data.php&quot;);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

DataInputStream in = new DataInputStream(url.openStream());

while (in.available() &gt 0) System.out.println(in.readLine());

Até mais …

Olá,

Deixa eu ver se eu entendi correto.

Esse seu código roda de tempos em tempos, conectando a esse URL e parseando os dados XML com DOM?

E normalmente isso funciona mas às vezes durante a noite dá essas exceções?

Se esse for o caso, não concordo muito com as sugestões dadas aqui. Parece mais provável que seu código tá bom, só que o serviço que você está usando não está disponível às vezes. Talvez o sistema for desligado durante um tempinho a noite para fazer backup, talvez às vezes ocorram problemas da rede, ou alguma coisa desse gênero.

[]s,
Sami

É mesmo isso!
Uso uma thread que acorda de hora a hora, faz o parser do xml e guarda-os em DB.
Inicial/ tb pensei o mesmo que o Same, que fosse problema do servidor de dados, mas agora não estou mto convencida disso.

Tenho a certeza que o código funciona, mas ao fim de algum tempo a correr, obtenho a tal excepção e é despoletada pela linha:

InputStream inputXML = url.openStream();

Então li o tutorial aqui do GUJ, e vi que talvez falte a parte

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

Vou tentar, conforme sugeriu o nbluis, mas gostava de perceber qual a diferença entre colocar esta linha ou não???

Obrigada,
CLáudia

:cry:

Nbluis usei o teu código!!
Agora nem uma vez funcionou, obtenho logo excepção na 3ªlinha

java.net.ConnectException: Connection timed out: connect

DataInputStream in = new DataInputStream(url.openStream());

HELPPPPPP

Acredito que seja um problema de timeout to servidor web que tu estás requisitando.

Testa isso em outra url… tipo www.guj.com.br.

Caso seja isso, terás que tratar caso aconteça um timeout tu requisitar novamente até conseguir finalizar o processo…

Aguardo para qualquer necessidade…

Até mais…

Luis real/ o problema deve ser do servidor web que estou requisitando. Com o url do guj não há timeouts!!!

Só mais uma coisa, podes me explicar a diferença entr os códigos:

 URL url = new URL("http://www.guj.com.br");
 InputStream inputXML = url.openStream();

OU

URL url = new URL("http://www.guj.com.br");
 
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
 DataInputStream in = new DataInputStream(url.openStream());

Pq não percebi sem criar a ligação http funciona, entao kal a diferença entre colocar esta linha ou não?!
Obrigada,
Cláudia