programing

HttpURL 접속 타임아웃 설정

sourcejob 2022. 9. 21. 23:27
반응형

HttpURL 접속 타임아웃 설정

URL 접속에 5초 이상 걸리면 false를 반환하고 싶은데 Java를 사용하면 어떻게 될까요?URL이 유효한지 확인하기 위해 사용하는 코드는 다음과 같습니다.

HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

HttpURLConnection에는 setConnectTimeout 메서드가 있습니다.

타임아웃을 5000밀리초로 설정하고 나서java.net.SocketTimeoutException

코드는 다음과 같습니다.


try {
   HttpURLConnection.setFollowRedirects(false);
   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");

   con.setConnectTimeout(5000); //set timeout to 5 seconds

   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}


이렇게 타임아웃을 설정할 수 있습니다.

con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);

HTTP Connection이 타임아웃되지 않는 경우 타임아웃 체커를 백그라운드스레드 자체(AsyncTask, Service 등)에 구현할 수 있습니다.다음 클래스는 특정 기간 후 타임아웃되는 비동기 태스크 사용자 정의의 예입니다.

public abstract class AsyncTaskWithTimer<Params, Progress, Result> extends
    AsyncTask<Params, Progress, Result> {

private static final int HTTP_REQUEST_TIMEOUT = 30000;

@Override
protected Result doInBackground(Params... params) {
    createTimeoutListener();
    return doInBackgroundImpl(params);
}

private void createTimeoutListener() {
    Thread timeout = new Thread() {
        public void run() {
            Looper.prepare();

            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    if (AsyncTaskWithTimer.this != null
                            && AsyncTaskWithTimer.this.getStatus() != Status.FINISHED)
                        AsyncTaskWithTimer.this.cancel(true);
                    handler.removeCallbacks(this);
                    Looper.myLooper().quit();
                }
            }, HTTP_REQUEST_TIMEOUT);

            Looper.loop();
        }
    };
    timeout.start();
}

abstract protected Result doInBackgroundImpl(Params... params);
}

이 샘플

public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer<Void, Void, Void> {

    @Override
    protected void onCancelled(Void void) {
        Log.d(TAG, "Async Task onCancelled With Result");
        super.onCancelled(result);
    }

    @Override
    protected void onCancelled() {
        Log.d(TAG, "Async Task onCancelled");
        super.onCancelled();
    }

    @Override
    protected Void doInBackgroundImpl(Void... params) {
        // Do background work
        return null;
    };
 }

시스템 속성 sun.net.client.defaultConnectTimeout을 설정할 수 있습니다.값은 밀리초 단위입니다.그러면 각 요청의 기본 타임아웃이 설정됩니다.

JVM 옵션 중 하나를 설정함으로써

- Dsun.net . client . default Connect Timeout = - - -

자바 코드에서의 OR-

System.setProperty("sun.net.client.defaultConnectTimeout", "setProperty");

간단한 라인을 추가하면 비슷한 문제를 해결할 수 있었다.

HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");

나의 요구는 응답 코드를 아는 것이었고, 그것을 위해서는 완전한 응답 본체를 얻는 것이 아니라 메타 정보를 얻는 것으로 충분했다.

기본 요청 방식은 GET으로 반환에 시간이 많이 걸리고 마지막으로 Socket Timeout이 발생하였습니다.예외.Request Method를 HEAD로 설정했을 때 응답이 매우 빨랐습니다.

언급URL : https://stackoverflow.com/questions/2799938/httpurlconnection-timeout-settings

반응형