미안이 문서화 한 ..J2ME 영구 HttpConnection에
OLD SETUP
I 따라 3 개 초 간격으로 서버에 접속하는 J2ME 클라이언트 애플리케이션이있다. 연결은 별도의 스레드에서 처리됩니다. 스레드는 while 루프에서 실행되며 다음과 같이 수행합니다
는- 열기 HTTP 연결
- 3 초
반복에 대한 처리를 위해 메인 UI 스레드에 - 수면을 보내 응답 & 수신
서버가 Apache이고 KeepAlive가 꺼져 있습니다. 클라이언트의 HTTP 요청 시간이 10 초입니다. 각 루프에는 약 4.5 초 (총 대기 시간 1.5 초)가 소요됩니다.
빈도가 낮은 (3G/GPRS 신호가 약할 때) 빈번하게 (1 시간 또는 2 시간마다) 스레드는 IO 블록을 수신하고 위의 1 단계에서 정지합니다. 무슨 일이 일어나고 있는지는 어딘가에있는 연결선이 죽었다고 생각하지만, 앱은 그것을 모르고 응답을 기다리고 있습니다. 네트워크 (이 경우 O2)는 내가 생각하기에 비난하는 것입니다. 연결은 30 분 동안 지속되어 결국 죽고 -1 응답 길이를 반환하고 결국 스레드가 계속됩니다. 이 비교적 희소 한 문제점을 극복하기 위해 응답이 60 초 이상 걸리면 스레드를 포기하고 새로운 응답을 생성했습니다.
최근까지이 큰 문제가 아니 었까지 다음과 같이, 그러나 우리는 우리의 네트워크 설정을 변경 :
NEW SETUP
- 을 인해 낮은 대역폭 제한으로 우리는 간격을 둔화 ~ 5 초입니다.
- 이제 모든 연결을 SSL 터널을 통해 서버에 연결합니다. 클라이언트에서
- HTTP 요청은 여전히 루프는 이러한 변화를 완료하는 데 약 7.5 초 (2.5 초 총 대기 시간)을 복용 한 앱 *
10 초 시간 제한이있다. 대기 시간이 늘어난 이유는 KeepAlive가 해제되어 있기 때문에 각 단일 연결에 SSL을 통한 핸드 쉐이크가 필요했기 때문입니다. 우리는 하나의 핸드 쉐이크를 의미하는 아파치 서버에서 KeepAlive를 켜고 계속되는 요청에 대해 지속적인 HTTP 연결을 전환하도록 권고 받았다. 우리는이 작업을 수행했으며, 대부분의 경우 연결 속도가 크게 향상되었습니다. 루프는 6.5 초까지 내려갑니다.
그래서 우리는 지금 새로운 설정에 대한 우리의 설정 변경이를 추가 할 수 있습니다
는 HTTP KeepAlive를 서버에 ON으로 전환 된- 그러나
(영구 TCP 연결을 할 수 있도록) , 가난한 3G/GPRS 영역에서는 스레드 블로킹 문제가 훨씬 더 빈번하게 발생하여 중요한 문제가되었습니다. 이는 실제로 취약한 서비스 영역에서 50 % 정도 발생합니다. 몇 번이나 새로운 스레드를 포크 할 수 없다고 말하는 메모리 부족 예외 Java를 받았습니다.또한, 좋은 3G 영역에서 우리는 이전에 일어나지 않았던 스레드 차단 문제를 지금도 볼 수 있습니다.
내가 분명히 지속적인 HTTP 연결 및 기본 TCP 등이 설정에서 뭔가 잘못을했을은 상당히 안정적이다 우리는 모든 앱을 다시 쓰기없이 이러한 변화하지만 십초의 HTTP 제한 시간을 관리 *
것 앱을 다시 작성해야합니다. 아마도이 시간 초과로 인해 문제가 발생했을 것입니까?
감사의 말씀 감사드립니다.