webForumDet fria alternativet
Logga in / Bli medlem

Time out

Java

4 svar · 244 visningar · startad av andreascarlsson

Medlem sedan feb. 2003202 inlägg
Frågan#1

Jag har en metod som kollar om en URL fungerar och svarar med rätt statuskod (200).
-------------------------------------------------------------------------------
public static boolean isValidUrl(String linkUrl)
{
if(linkUrl.equals(null) || linkUrl.equals(""))
return false;

URL url;
HttpURLConnection urlConn;

try
{
	url = new URL(linkUrl);
	urlConn = (HttpURLConnection)url.openConnection();

	if(HttpURLConnection.HTTP_OK != urlConn.getResponseCode())
		return false;

} catch(Exception e){return false;}

return true;

}

-------------------------------------------------------------------------------

Nu är det ju så att alla servrar (url:er) inte är så värst snabba på att svara... :-(

Finns det då något sätt att avbryta funktionen?? Så att man slipper vänta 2 minuter på att denna funktion skall köra färdigt (ifall någon site skulle känna för att strunta i att svara på detta anrop).

Alltså någon slags timerfunktion, som håller koll på att det inte gått mer än t.ex. 3 sekunder. Om det har gått mer än 3 sekunder så skall metoden returnera false... typ!

Finns det någon som har en idé... För mig står det helt stilla just nu! :-)

Medlem sedan juli 2001228 inlägg
#2

Detta borde funka.
He he, kan verka lite meckigt men jag är barnsligt förtjust i anonyma klasser.

	public static boolean isValidUrl(final String linkUrl,int timeout) 
	{ 

		if(linkUrl.equals(null) || linkUrl.equals("")) return false;
	
		final boolean[] isValid = new boolean[1];
	
		try {
			
			Thread t  = new Thread(
		
				new Runnable() {
		
					public void run() {				 		
				
						URL url; 
						HttpURLConnection urlConn; 
				
						try 
						{ 
							url = new URL(linkUrl); 
							urlConn = (HttpURLConnection)url.openConnection(); 
					
							if(HttpURLConnection.HTTP_OK == urlConn.getResponseCode()) 
								isValid[0] = true; 
						
						} catch(Exception e){ } 
					}
				}
			);
		
			t.start();
			t.join(timeout);
		}
		catch(Exception e){ }
		
		return isValid[0];
	
	}

mvh
phonk

Medlem sedan feb. 2003202 inlägg
#3

Funkar klockrent!!! Tackar!!! :-)

En liten fråga bara... Varför använde du en array av typen boolean, istället för att endast deklarera en variabel av typen boolean?? *Nyfiken* :-)

Sedan undrar jag varför du deklarerade argumentet "linkUrl" som en final String??? Det finns säkert en jättebra anledning, men jag är ju ingen Javagud direkt.... :-)

Tack än en gång!!!

Medlem sedan juli 2001228 inlägg
#4

Jo, en anonym klass(innre klasser) har bara tillgång till metodvariabler som är final. Detta pga av att en instans av en innre klass har möjlighet att "leva" längre än metoden den ligger i och eftersom metodvariabler dör när metoden returnerar skulle det kunna stöka till det ordentligt.

Tricket är att man kan deklarera ett objekt som final men innehållet behöver ju inte vara final. Mao, man får inte tilldela objektreferensen en ny objekt-instans men det är helt ok att förändra innehållet.

Samma sak med linkUrl, den måste vara final för att den innre klassen ska få tillgång till den.

mvh
phonk

Medlem sedan feb. 2003202 inlägg
#5

Ok!

Tack för lektionen!! :-)

263 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)