2012-10-19 33 views
5

Per cominciare, ho controllato le discussioni relative a questo problema e non sono riuscito a trovare una risposta al mio problema ed è per questo che sto aprendo questa domanda.Numero massimo di thread

Ho impostato un servizio Web utilizzando il restlet 2.0.15. L'implementazione è solo per il server. Le connessioni al server sono fatte attraverso una pagina web, e quindi non ho usato ClientResource.

La maggior parte delle risposte alla esaurimento del problema pool di thread ha suggerito l'inserimento di

#exhaust + #release

Il processo di servizio web può essere descritto come un unico function.Receive GET richieste dalla pagina web, interrogazione il database, inquadra i risultati in XML e restituisce la rappresentazione finale. Ho usato un filtro per sovrascrivere il beforeHandle e afterHandle.

Il codice per codice di creazione del componente:

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

I parametri sono il risultato di una discussione presenti in questo forum e la modifica da parte mia, nel tentativo di massimizzare l'efficienza.

Venendo alla domanda, il codice è il seguente:

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

Ho usato un esempio filtro trovato in una discussione anche qui. L'implementazione è la seguente:

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 { 

     } 

    } 

} 

Il responseRepresentation non hai #release method perché blocca i processi che danno l'avvertimento WARNING: A response with a 200 (Ok) status should have an entity (...)

Il codice della realizzazione ServerResource è il seguente:

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

} 

} 

Ho provato le soluzioni fornite in altri thread ma nessuno di loro sembra funzionare. Innanzitutto, non sembra che il pool di thread sia aumentato con i parametri impostati come warnings state that the thread pool available is 10. Come accennato in precedenza, l'aumento del valore maxThreads sembra solo posticipare il risultato.

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

Ci potrebbe essere qualche errore relativo alla Restlet version, ma ho scaricato la versione stabile per verificare questo non era il servizio Web issue.The sta avendo circa 5000 richieste al giorno, che non è molto. Nota: l'inserimento del #release method sia nell'errore ServerResource or OriginFilter rendimenti e l'avviso di cui ("WARNING: A response with a 200 (Ok) status should have an entity (...)")

prega di guida. Grazie!

risposta

1

Leggendo questo site il problema relativo al lato server che ho descritto è stato risolto aggiornando la distribuzione di Restlet allo 2.1 version. Dovrai modificare qualche codice. Si consiglia di consultare il rispettivo migration guide.

Problemi correlati