2012-10-19 24 views
5

Na początek sprawdziłem dyskusje dotyczące tego problemu i nie mogłem znaleźć odpowiedzi na mój problem i dlatego właśnie otwieram to pytanie.Maksymalny problem z wątkami

Skonfigurowałem usługę internetową za pomocą restletu 2.0.15. Implementacja dotyczy tylko serwera. Połączenia z serwerem są nawiązywane za pośrednictwem strony internetowej, dlatego nie korzystałem z ClientResource.

Większość odpowiedzi na wyczerpanie puli wątków problemu zaproponował włączenie

#exhaust + #release

Proces usługi internetowej można opisać jako pojedynczy function.Receive GET żądań ze strony internetowej, zapytania bazę danych, ustaw wyniki w XML i zwróć ostateczną reprezentację. Użyłem filtra, aby zastąpić beforeHandle i afterHandle.

Kod dla składnika kodu utworzenia:

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(); 

Parametry są wynikiem obecnej dyskusji na tym forum i modyfikacji przez mojego udziału w próbie, aby zmaksymalizować wydajność.

Jadąc do wniosku, kod jest w następujący sposób:

@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; 
} 

użyłem przykładowy filtr znajdujący się w dyskusji tutaj, też. Realizacja przedstawia się następująco:

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 nie posiada #release method bo wywala procesy dające ostrzeżenie WARNING: A response with a 200 (Ok) status should have an entity (...)

Kod realizacji ServerResource jest następujący:

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(); 

} 

} 

Próbowałem rozwiązań dostarczonych w innych wątkach, ale żaden z nich nie wydaje się działać. Po pierwsze, nie wydaje się, że pula wątków jest rozszerzana o parametry ustawione jako warnings state that the thread pool available is 10. Jak wspomniano wcześniej, wzrost wartości maxThreads tylko wydaje się odkładać wynik.

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

Nie może być jakiś błąd dotyczący Restlet version, ale Pobrałem stabilną wersję do sprawdzenia to nie był issue.The Web Service jest o około 5000 wniosków dziennie, co nie jest dużo. Uwaga: wkładanie #release method albo w błędzie ServerResource or OriginFilter zwrotów i mowa ostrzeżenie ("WARNING: A response with a 200 (Ok) status should have an entity (...)")

proszę kierować. Dzięki!

Odpowiedz

1

Odczytując ten site problem rezydujący po stronie serwera, który opisałem, został rozwiązany poprzez uaktualnienie dystrybucji Restletu do 2.1 version. Będziesz musiał zmienić kod. Powinieneś skonsultować się z odpowiednimi migration guide.