2012-10-19 1 views
5

먼저이 문제에 대한 토론을 확인했는데 내 문제에 대한 대답을 찾을 수 없었습니다. 그래서이 질문을 열었습니다.최대 스레드 문제

restlet 2.0.15를 사용하여 웹 서비스를 설정했습니다. 구현은 서버에만 적용됩니다. 서버 연결은 웹 페이지를 통해 이루어 지므로 ClientResource를 사용하지 않았습니다. 스레드 풀 문제의 고갈에 대한 답변의 대부분은

#exhaust + #release

의 포함을 제안 웹 서비스의 프로세스가 하나의 function.Receive로 웹 페이지, 쿼리 GET 요청을 설명 할 수

결과를 XML로 프레임 화하고 최종 표현을 리턴하십시오. 필터를 사용하여 beforeHandle 및 afterHandle을 재정의했습니다.

구성 요소 생성 코드의 코드 :

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, 8188); 
component.getContext().getParameters().add("maxThreads", "512"); 
component.getContext().getParameters().add("minThreads", "100"); 
component.getContext().getParameters().add("lowThreads", "145"); 
component.getContext().getParameters().add("maxQueued", "100"); 
component.getContext().getParameters().add("maxTotalConnections", "100"); 
component.getContext().getParameters().add("maxIoIdleTimeMs", "100"); 
component.getDefaultHost().attach("/orcamento2013", new ServerApp()); 
component.start(); 

매개 변수는 효율성을 극대화하기 위해 내 일부에 의해이 포럼 및 수정에서 토론 현재의 결과이다. 다음과 같이

는 응용 프로그램에 오는 코드는 다음과 같습니다

@Override 
public synchronized Restlet createInboundRoot() { 
    // Create a router Restlet that routes each call to a 
    // new instance of HelloWorldResource. 
    Router router = new Router(getContext()); 

    // Defines only one route 
    router.attach("/{taxes}", ServerImpl.class); 
    //router.attach("/acores/{taxes}", ServerImplAcores.class); 

    System.out.println(router.getRoutes().size()); 

    OriginFilter originFilter = new OriginFilter(getContext()); 
    originFilter.setNext(router); 

    return originFilter; 
} 

내가 너무 여기 토론에 발견 예를 들어 필터를 사용했다. 구현은 다음과 같다 :

public class ServerImpl extends ServerResource { 

String itemName; 

@Override 
protected void doInit() throws ResourceException { 
    this.itemName = (String) getRequest().getAttributes().get("taxes"); 

} 

@Get("xml") 
public Representation makeItWork() throws SAXException, IOException { 

    DomRepresentation representation = new DomRepresentation(MediaType.TEXT_XML); 

    DAL dal = new DAL(); 

    String ip = getRequest().getCurrent().getClientInfo().getAddress(); 

    System.out.println(itemName); 

    double tax = Double.parseDouble(itemName); 

    Document myXML = Auxiliar.getMyXML(tax, dal, ip); 
    myXML.normalizeDocument(); 

    representation.setDocument(myXML); 

    return representation; 

} 

@Override 
protected void doRelease() throws ResourceException { 

    super.doRelease(); 

} 

} 
:이 경고를주는 프로세스를 충돌 때문에

public OriginFilter(Context context) { 
    super(context); 
} 

@Override 
protected int beforeHandle(Request request, Response response) { 
    if (Method.OPTIONS.equals(request.getMethod())) { 
     Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers"); 
     String origin = requestHeaders.getFirstValue("Origin", true); 


     Form responseHeaders = (Form) response.getAttributes().get("org.restlet.http.headers"); 
     if (responseHeaders == null) { 
      responseHeaders = new Form(); 
      response.getAttributes().put("org.restlet.http.headers", responseHeaders); 

      responseHeaders.add("Access-Control-Allow-Origin", origin); 
      responseHeaders.add("Access-Control-Allow-Methods", "GET,POST,DELETE"); 
      responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
      responseHeaders.add("Access-Control-Allow-Credentials", "true"); 
      response.setEntity(new EmptyRepresentation()); 
      return SKIP; 
     } 
    } 

    return super.beforeHandle(request, response); 
} 

@Override 
protected void afterHandle(Request request, Response response) { 

    if (!Method.OPTIONS.equals(request.getMethod())) { 
     Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers"); 
     String origin = requestHeaders.getFirstValue("Origin", true); 


     Form responseHeaders = (Form) response.getAttributes().get("org.restlet.http.headers"); 
     if (responseHeaders == null) { 
      responseHeaders = new Form(); 
      response.getAttributes().put("org.restlet.http.headers", responseHeaders); 

      responseHeaders.add("Access-Control-Allow-Origin", origin); 
      responseHeaders.add("Access-Control-Allow-Methods", "GET,POST,DELETE"); // 
      responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
      responseHeaders.add("Access-Control-Allow-Credentials", "true"); 

     } 
    } 

    super.afterHandle(request, response); 

    Representation requestRepresentation = request.getEntity(); 
    if (requestRepresentation != null) { 
     try { 
      requestRepresentation.exhaust(); 
     } catch (IOException e) { 
      // handle exception 
     } 

     requestRepresentation.release(); 
    } 

    Representation responseRepresentation = response.getEntity(); 
    if(responseRepresentation != null) { 
     try { 
      responseRepresentation.exhaust(); 
     } catch (IOException ex) { 
      Logger.getLogger(OriginFilter.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 

    } 

} 

responseRepresentation#release method이없는 WARNING: A response with a 200 (Ok) status should have an entity (...)

ServerResource 구현의 코드는 다음과 같다

다른 스레드에서 제공되는 솔루션을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. 첫째, 스레드 풀이 warnings state that the thread pool available is 10으로 설정된 매개 변수로 확장되지 않는 것 같습니다. 앞서 언급했듯이 maxThreads 값의 증가 만 결과를 지연시키는 것처럼 보입니다.

Example: INFO: Worker service tasks: 0 queued, 10 active, 17 completed, 27 scheduled. 

Restlet version에 관한 약간의 오차가있을 수 있습니다,하지만 난 이것이 issue.The 웹 서비스를 많이하지 않습니다 하루에 약 5,000 요청을 데 아니 었 확인하기 위해 안정적인 버전을 다운로드. 참고 :하여 ServerResource or OriginFilter 반환 오류 발생 #release method 중 하나에 삽입하고 언급

("WARNING: A response with a 200 (Ok) status should have an entity (...)")가 안내하십시오 경고. 감사합니다.

답변

1

site을 읽음으로써 설명한 서버 측의 문제는 Restlet 배포판을 2.1 version으로 업그레이드하여 해결되었습니다. 일부 코드를 변경해야합니다. 각각 migration guide과 상담해야합니다.