내 서블릿이 세 가지 작업을 수행합니다서블릿 URL 패턴 - 서블릿 컨텍스트에서 java.lang.NullPointerException이
는 객체 sharedClient에 메시지 "resourceupdate"저장 요청 된 리소스 (HTML 페이지)를 수신.
"t = UPDATE"로 표시된 비동기 get (querystring)을 받으면이 요청이 보류중인 sharedClient 객체를 추가합니다.
delivery_resource (pathinfo myServlet/sharedsessionID로 표시 - 예 : myServlet/8439jfndofsd93jcanjc)를 받으면 자원의 디스패치를 수행합니다. 나는이 방법으로 모든 활성 SharedClients을 유지
<servlet>
<description></description>
<display-name>MyServlet</display-name>
<servlet-name>MyServlet</servlet-name>
<servlet-class>it.package.MyServlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet/*</url-pattern>
</servlet-mapping>
:
이
내의 Web.xml입니다ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>) this.getServletConfig().getServletContext().getAttribute("sharedClients");
그리고 나는이 방법으로 특정 SharedSessionID으로 SharedClient를 얻을 :
SharedClient targetClient = hmClients.get(ssid);
문제 : 내가 resourceupdate 서블릿을 제대로 작동시킬 때까지 b ut_source_type (myServlet/sharedsessionID 유형의 경로)에 서블릿이 sharedClient 참조를 가져올 수 없으며 널 포인터 예외가 발생합니다.
if (resourceUri!=null) {
String ssid = resourceUri.substring(1);
ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>) this.getServletConfig().getServletContext().getAttribute("sharedClients");
if (hmClients.containsKey(ssid)) {
SharedClient targetClient = hmClients.get(ssid);
if (targetClient.getParticipantSession().containsKey(session)) {
IoUtils.copy(targetClient.streamSnapshot(), response.getOutputStream());
}
} else System.out.println("hmClient do not contains ssid"); //always in this branch
이 시간부터 비동기 가져 오기를 사용한 긴 폴링도 성공적으로 완료되지 않습니다.
업데이트 후에 myServlet/sharedsessionID 유형의 경로에 delivery_resource를 수행하지 않으면 비동기 get이 계속 제대로 작동합니다.
감사합니다.