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!