url-Service timeout einrichten?

Status
Nicht offen für weitere Antworten.
J

JayJay

Gast
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!!!!!!

Code:
			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?
 
G

Gast

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

red99

Gast
Code:
	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

Top Contributor
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
 
J

Jayjay

Gast
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

Mitglied
Hallo,

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

Code:
// 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
Code:
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
Code:
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

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

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

Grüße

Christian[/code]
 

Ralf W. Balz

Mitglied
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

Code:
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;
	}
}

Code:
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

Bekanntes Mitglied
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

Mitglied
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

Code:
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

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

Christian
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards JAR als Windows Service mit Appache Procrun (prunsrv) Allgemeine Java-Themen 6
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
O Service oder Controller Allgemeine Java-Themen 6
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
X Kapselung Wie würdet ihr ein Service Layer erreichbar machen ... Allgemeine Java-Themen 62
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
X Threads Java Chached Executors Service Allgemeine Java-Themen 12
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
K Hilfe bei GUI für Pizza-Service Allgemeine Java-Themen 11
L TV Programm API/Web Service o.ä. Allgemeine Java-Themen 6
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
Nero90 FileSystem Watcher Service Allgemeine Java-Themen 1
W Windows (Service) Hooking Allgemeine Java-Themen 8
C Threads ExecutorService shutdown abbrechen und service "starten" ? Allgemeine Java-Themen 3
A Framework für einen Web Service Allgemeine Java-Themen 6
M Webservices: WSDL Files ohne "Service" Element? Allgemeine Java-Themen 4
D ewig laufendes Javaprogramm ("Service") Allgemeine Java-Themen 17
D Executor Service nach getaner Arbeit beenden Allgemeine Java-Themen 3
Iron Monkey Listening for Print Service Status Changes Allgemeine Java-Themen 2
D Daemon bzw. Windows Service Allgemeine Java-Themen 5
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
G Java App als Service Allgemeine Java-Themen 2
M Webservice timeout bei Ausführung der .jar Allgemeine Java-Themen 3
M iMacros/Timeout Allgemeine Java-Themen 0
G Timeout funktion zu einer Eventlogabfrage Allgemeine Java-Themen 2
N Timeout setzen Allgemeine Java-Themen 10
R Socket verbindung mit Timeout Allgemeine Java-Themen 2
S Thread nach Timeout beenden Allgemeine Java-Themen 2
K Runtime.exec mit Timeout Allgemeine Java-Themen 5
P Nicht terminierende Methoden abfangen - timeout ? Allgemeine Java-Themen 3
0 Timeout für Thread setzen? Allgemeine Java-Themen 2
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7
M JDK installieren OpenJDK13 installieren, Einrichten? Ubuntu 18.04. Allgemeine Java-Themen 2
P CVS Server einrichten. Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben