월별 글 목록: 2012년 6월월

Android 에서 Restlet Net extension HTTP client connector 사용 시 timeout 설정

 결론부터 말하자면 라이브러리 버그랄까…

안드로이드에서는 net extension의 HTTP client connector를 사용하면
connection timeout 과 read timeout을 설정해도 적용이 안된다.

Resetlet 문서를 보면 Internal Connector의 HTTP connector는
development only 를 추천한다고 당당히 써 있기도 한데다가
서버 다운으로 접속이 안될 때 자꾸 문제를 있으켜서 Net extention의 HTTP connector를 쓰기로 했다.

안드로이드에서는 자동으로 쓸수 있게 하는게 안된다는거 같고.. 다음과 같이 해줘야 한다.

final Engine engine = Engine.getInstance();
engine.getRegisteredClients().clear();
engine.getRegisteredClients().add(new HttpClientHelper(null));

그리고, read timeout 과 connection timeout을 설정하고, ClientResource에서
해당 client를 사용하도록 설정해 준다.

final Context context = new Context();

final Series<Parameter> parameters = context.getParameters();
parameters.add(“readTimeout”, Integer.toString(READ_TIMEOUT));

final Client client = new Client(context, Protocol.HTTP);
client.setConnectTimeout(CONNECTION_TIMEOUT);

final ClientResource cr = new ClientResource(requestUrl);
cr.setNext(client);

그런데, timeout이 전혀 안먹는다=_=
설정하는 방법이 잘못됐나 싶어 온갖 삽질을 동원하며 이리저리 테스트 해도 답이 나오질 않는다..
그래서, 결국 Restlet 소스를 뒤지기 시작했다.
(라이브러리 소스나 뒤지는 신세라니… OTL)

마침내 찾아낸 부분은… org/restlet/ext/net/internal/HttpUrlConnectionCall.java 파일의

            // These properties can only be used with Java 1.5 and upper
            // releases
            int majorVersionNumber = SystemUtils.getJavaMajorVersion();
            int minorVersionNumber = SystemUtils.getJavaMinorVersion();
            if ((majorVersionNumber > 1)
                    || ((majorVersionNumber == 1) && (minorVersionNumber >= 5))) {
                this.connection.setConnectTimeout(getHelper()
                        .getConnectTimeout());
                this.connection.setReadTimeout(getHelper().getReadTimeout());
            }

JDK 버전을 체크해서 1.5 이상 일때만 timeout을 설정하도록 하는 부분이었다.
먼가 의심스러워서, 안드로이드에서 버전값을 찍어 봤다.
… 둘다 0 이 나온다..=_=
이건 내가 잘못한건지 쟤들이 안드로이드용이라면서 안드로이드 고려를 못한건지…
도저히 판단이 안서는 상황이지만, 구국의 결단을 내려 라이브러리 소스를 직접 컴파일해 쓰기로 결정;;

            this.connection.setConnectTimeout(getHelper()
                    .getConnectTimeout());
            this.connection.setReadTimeout(getHelper().getReadTimeout());

요렇게 고쳐서 해결을 봐버렸다=_=