먼저이 문제에 대한 토론을 확인했는데 내 문제에 대한 대답을 찾을 수 없었습니다. 그래서이 질문을 열었습니다.최대 스레드 문제
restlet 2.0.15를 사용하여 웹 서비스를 설정했습니다. 구현은 서버에만 적용됩니다. 서버 연결은 웹 페이지를 통해 이루어 지므로 ClientResource를 사용하지 않았습니다. 스레드 풀 문제의 고갈에 대한 답변의 대부분은
#exhaust + #release
의 포함을 제안 웹 서비스의 프로세스가 하나의 function.Receive로 웹 페이지, 쿼리 GET
요청을 설명 할 수
구성 요소 생성 코드의 코드 :
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 (...)")
가 안내하십시오 경고. 감사합니다.