# url-Service timeout einrichten?



## JayJay (30. Jul 2007)

Hallo Leute,

und zwar hab ich hier einen Service der alle 10 Minuten URLS aufruft. Nur bleibt er immer hängen, wenn eine URL nicht erreichbar ist!!!!!!


```
URL urlService = new URL( service_url );
			StringWriter sw = new StringWriter();
			PrintWriter  pw = new PrintWriter(sw);
			InputStream content = (InputStream)urlService.getContent();			// timout?
			BufferedReader in = new BufferedReader (new InputStreamReader (content));
			
			String line;
			while ((line = in.readLine()) != null) {
				pw.println (line);
			}
```

gibt es dafür eine bessere / andere Möglichkeit mit eine Timout funktion?


----------



## Gast (30. Jul 2007)

Versuch es über Sockets .... Da kannst du einen Timeout einstellen.


----------



## red99 (30. Jul 2007)

```
public static void main(String[] args) {

		try {
			URL urlService = new URL("www.gdfhgdsgk.de");
	
	        StringWriter sw = new StringWriter();
	        PrintWriter  pw = new PrintWriter(sw);
	        InputStream content = (InputStream)urlService.getContent();         // timout?
	        BufferedReader in = new BufferedReader (new InputStreamReader (content));
	        
	        String line;
	        while ((line = in.readLine()) != null) {
	           pw.println (line);
	        }
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
```

also bei mir wirft er eine exception wenn die url nicht exisitiert


----------



## HoaX (30. Jul 2007)

red99, ob eine url existiert ist etwas anderes wie wenn der host nicht antwortet.

imho kannst du mit url da nicht viel ausrichten. httpclient von apache bietet aber bestimmt was


----------



## Jayjay (31. Jul 2007)

HoaX hat gesagt.:
			
		

> red99, ob eine url existiert ist etwas anderes wie wenn der host nicht antwortet.
> 
> imho kannst du mit url da nicht viel ausrichten. httpclient von apache bietet aber bestimmt was



Genau so schaut es aus. Hm ok dann muss ich es leider über sockets machen, ... leider etwas umständlich... :roll:


----------



## Ralf W. Balz (31. Jul 2007)

Hallo,

im Prinzip sollte es so wie du es geschrieben hast auch funktionieren, wenn du die Exception abfängst und das Protokoll mit angibst.


```
// URL urlService = new URL("www.gdfhgdsgk.de");            ohne Protokoll
URL urlService = new URL("http://www.gdfhgdsgk.de ");      // besser
```

Schau mal hier: forum.java.sun.com

Wie folgt, so geht es bei mir auf jeden Fall. Ich habe als Test mal vier Urls aufgerufen, wobei die zweite Url sicher ein Time out machen sollte weil sie nicht zu erreichen ist, aber der Name ist Existent. Wie du auch feststellen kannst, wenn du ein Ping darauf machst. Sicher sollte man die Exeption am besten in eine Datei, so wie Error.log, schreiben (Klar, das ist sicher hier nur ein kurzes Beispiel). Ich habe dann folgende Ausgabe (gekürzt):

Ausgabe:

Java-Forum: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">*[...]*

java.net.ConnectException: Connection timed out: connect
*[...]*
Time out: 

java.net.UnknownHostException: www.kjhhgjzbnbb.de
*[...]*
Unbekannter Host:

java.net.MalformedURLException: no protocol: www.spiegel.de
*[...]*
Ohne Protokoll: 

Gruß Ralf

MeinService.java

```
public class MeinService {

	public static void main(String[] args) {
	
		StringBuffer buffer = new StringBuffer();
		Crawler crawl = new Crawler();

		buffer =  crawl.getContent("http://www.java-forum.org");
		System.out.println("Java-Forum: " + buffer);
		
		buffer =  crawl.getContent("http://bobman.darktech.org");
		System.out.println("Time out: " + buffer);
	
		buffer =  crawl.getContent("http://www.kjhhgjzbnbb.de");
		System.out.println("Unbekannter Host: " + buffer);
		
		buffer =  crawl.getContent("www.spiegel.de");
		System.out.println("Ohne Protokoll: " + buffer);
	}
}
```

Crawler.java

```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class Crawler {
	
	public StringBuffer getContent(String url){

		StringBuffer buffer = new StringBuffer();
		
		try {
			URL urlService = new URL(url);

			InputStream content = (InputStream)urlService.getContent();    
			BufferedReader in = new BufferedReader (new InputStreamReader (content));
			          
			String line;
			while ((line = in.readLine()) != null) {
				buffer.append(line);
			}
		} catch (MalformedURLException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}   	
		return buffer;
	}
}
```


----------



## Ullenboom (31. Jul 2007)

Wie wäre es mit http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#setConnectTimeout(int)?


```
URLConnection urlConnection = url.openConnection();
urlConnection.setConnectTimeout( timeout );
InputStream content = urlConnection.getInputStream();
```

Grüße

 Christian[/code]


----------



## Ralf W. Balz (31. Jul 2007)

Hallo,



> Wie wäre es mit http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#setConnectTimeout(int)?



@Ullenboom  Wäre genau das was er sucht! Wie könnte man jetzt  in Zeile 18 den Fehler abfangen, dass es ein TimeOut gegeben hat? Momentan ist es so, dass es einen Fehler gibt wenn er versucht, den ImputStream in Zeile 19 zu holen obwohl keine connection besteht. Protected connected kann man nicht abfragen, sonst habe ich nichts gesehen was einen weiterhelfen könnte.

Gruß Ralf


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Crawler {

	public StringBuffer getContent(URL url, int TimeOut){
		
		StringBuffer buffer = new StringBuffer();
		
		try {
			URLConnection urlConnection = url.openConnection();
			urlConnection.setConnectTimeout( TimeOut );
// Abfangen des  TimeOut
			InputStream content = urlConnection.getInputStream();
			BufferedReader in = new BufferedReader (new InputStreamReader (content));
			          
			String line;
			while ((line = in.readLine()) != null) {
				buffer.append(line);
			}
// Ende des Abfangens
		} catch (MalformedURLException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}   	
		return buffer;
	}
}
```


```
import java.net.URL;

public class MeinService {
	public static void main(String[] args) throws Exception  {
	
		
		StringBuffer buffer = new StringBuffer();
		Crawler crawl = new Crawler();

		//TimeOut nach 2 sekunden
		buffer =  crawl.getContent(new URL("http://bobman.darktech.org"),2000); 
		System.out.println("Time out: " + buffer);
	}
}
```


----------



## Ullenboom (31. Jul 2007)

Wenn keine Connection kommt, bekommt man doch eine SocketTimeoutException, die man abfangen kann, oder?

setConnectTimeout
public void setConnectTimeout(int timeout)
Sets a specified timeout value, in milliseconds, to be used when opening a communications link to the resource referenced by this URLConnection. If the timeout expires before the connection can be established, a java.net.SocketTimeoutException is raised. A timeout of zero is interpreted as an infinite timeout.

getInputStream() ist doch blockierend.

Christian


----------



## Ralf W. Balz (31. Jul 2007)

Ja richtig, man bekommt eine SocketTimeoutException die man abfangen kann. 

Nur war meine Ausgabe folgende (siehe unten), - man beachte das ---- Ende Crawling ---, was eigentlich als allerletztes kommen sollte. Es kommt noch vor dem Ende der Fehlermeldung in die Ausgabe.

Erklären kann ich es mir nur folgendermaßen, dass die Standard-Ausgabe schneller ist wie die Fehlerausgabe?! Wenn man die SocketTimeoutException und den UnknownHostException abfängt, bzw. behandelt oder nicht in die Ausgabe schreiben lässt, ist die Ausgabe in Ordnung.

Gruß 
Ralf


```
import java.net.URL;

public class MeinService {

	public static void main(String[] args) throws Exception  {
		
		StringBuffer buffer = new StringBuffer();
		Crawler crawl = new Crawler();
	
		buffer =  crawl.getContent(new URL("http://www.java-forum.org"),2000);
		System.out.println("Java-Forum: " + buffer);
		
		buffer =  crawl.getContent(new URL("http://www.kjhhgjzbnbb.de"),2000);
		System.out.println("Unbekannter Host: " + buffer);
				
		buffer =  crawl.getContent(new URL("http://bobman.darktech.org"),2000);
		System.out.println("bobman.darktech.org: " + buffer);
		
		System.out.println(" ---- Ende Crawling --- ");
	}
}
```

*....(gekürzt)...*

	at sun.net.www.http.HttpClient.<init>(Unknown Source)
	at sun.net.www.http.HttpClient.New(Unknown Source)bobman.darktech.org: 
 ---- Ende Crawling --- 

	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 Source)
	at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at eu.netmetrix.Crawler.getContent(Crawler.java:21)
	at eu.netmetrix.MeinService.main(MeinService.java:19)


----------



## Ullenboom (1. Aug 2007)

Ja. System.err und System.out sind nicht synchronisiert. Bei haben ihren eigenen Puffer und was das flush angeht "ihren einen Kopf".

 Christian


----------

