Java 少数请求后的Restlet在CPU上生成负载
我对我正在创建的API有问题。我使用Restlet创建带有json响应的API。首先,我阅读了restlet的文档,并使用了他们在这里介绍的简单模型: 我的代码基本相同,只是有一些部分。我的服务器资源是:Java 少数请求后的Restlet在CPU上生成负载,java,restlet,Java,Restlet,我对我正在创建的API有问题。我使用Restlet创建带有json响应的API。首先,我阅读了restlet的文档,并使用了他们在这里介绍的简单模型: 我的代码基本相同,只是有一些部分。我的服务器资源是: public class CategoriesResource extends ServerResource { @Get("json") public StringRepresentation represent(Representation entity) {
public class CategoriesResource extends ServerResource {
@Get("json")
public StringRepresentation represent(Representation entity) {
dbOperations db = new dbOperations();
db.connect();
Series<Header> responseHeaders = (Series<Header>) getResponse().getAttributes().get("org.restlet.http.headers");
if (responseHeaders == null) {
responseHeaders = new Series(Header.class);
getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
}
responseHeaders.add("Access-Control-Allow-Origin", "*");
return new StringRepresentation(db.getCategoriesJson(), MediaType.APPLICATION_JSON);
}
}
主要的问题是,当我按下F5时,我的CPU负载会增加很多。我在搜索这个问题,我能够做的线程转储是给这个用法
Restlet-9860934" prio=10 tid=0x8828d000 nid=0x12ee runnable [0x87f89000]
java.lang.Thread.State: RUNNABLE
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at org.restlet.engine.connector.Way.toString(Way.java:594)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at org.restlet.engine.connector.Way.onSelected(Way.java:471)
at org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
at org.restlet.engine.connector.Connection.onSelected(Connection.java:612)
- locked <0x937a7550> (a java.nio.HeapByteBuffer)
at org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
at org.restlet.engine.connector.ConnectionController.onSelected(ConnectionController.java:219)
at org.restlet.engine.connector.ServerConnectionController.onSelected(ServerConnectionController.java:99)
at org.restlet.engine.connector.ConnectionController.selectKeys(ConnectionController.java:308)
at org.restlet.engine.connector.ConnectionController.doRun(ConnectionController.java:171)
at org.restlet.engine.connector.Controller.run(Controller.java:159)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Restlet-9860934“prio=10 tid=0x8828d000 nid=0x12ee可运行[0x87f89000]
java.lang.Thread.State:可运行
位于java.lang.String.valueOf(String.java:2854)
位于java.lang.StringBuilder.append(StringBuilder.java:128)
位于org.restlet.engine.connector.Way.toString(Way.java:594)
位于java.lang.String.valueOf(String.java:2854)
位于java.lang.StringBuilder.append(StringBuilder.java:128)
位于org.restlet.engine.connector.Way.onSelected(Way.java:471)
位于org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
位于org.restlet.engine.connector.Connection.onSelected(Connection.java:612)
-锁定(一个java.nio.HeapByteBuffer)
位于org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
位于org.restlet.engine.connector.ConnectionController.onSelected(ConnectionController.java:219)
位于org.restlet.engine.connector.ServerConnectionController.onSelected(ServerConnectionController.java:99)
位于org.restlet.engine.connector.ConnectionController.selectKeys(ConnectionController.java:308)
位于org.restlet.engine.connector.ConnectionController.doRun(ConnectionController.java:171)
位于org.restlet.engine.connector.Controller.run(Controller.java:159)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
在java.util.concurrent.FutureTask.run(FutureTask.java:166)中
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:724)
这是restlet线程,我想这是它的错误。我不知道如何修复它。我正在搜索这个问题,在github上只找到了386和794问题。如果有人知道我如何修复它,请告诉我。我遇到了完全相同的错误,我刚刚找到了如何复制它:
public Restlet createInboundRoot() {
Router router = new Router(getContext());
ChallengeAuthenticator authenticator = new ChallengeAuthenticator(getContext(), ChallengeScheme.HTTP_BASIC, "cancel");
Verifier verifier = new Verifier() { // not even used
@Override
public int verify(Request arg0, Response arg1) {
return Verifier.RESULT_VALID;
}
};
authenticator.setVerifier(verifier);
router.attach("/test", HelloResource.class);
Authorizer authorizer = new Authorizer() { // authorizer only being used to delay request
@Override
protected boolean authorize(Request arg0, Response arg1) {
try {
Thread.sleep(5000); // request is delayed by 5000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
};
authorizer.setNext(router);
authenticator.setNext(authorizer);
return authenticator;
}
所以我做的很简单,我把请求延迟了5秒。
当我在浏览器中请求资源时,我会立即取消请求。之后,我的CPU使用率会上升到100%,并保持在该水平…我设法发现,当我向服务器发出多个请求时,CPU使用率很高,而当请求未正确完成时,会出现此问题。这里的问题与此完全相同,如何解决?
public Restlet createInboundRoot() {
Router router = new Router(getContext());
ChallengeAuthenticator authenticator = new ChallengeAuthenticator(getContext(), ChallengeScheme.HTTP_BASIC, "cancel");
Verifier verifier = new Verifier() { // not even used
@Override
public int verify(Request arg0, Response arg1) {
return Verifier.RESULT_VALID;
}
};
authenticator.setVerifier(verifier);
router.attach("/test", HelloResource.class);
Authorizer authorizer = new Authorizer() { // authorizer only being used to delay request
@Override
protected boolean authorize(Request arg0, Response arg1) {
try {
Thread.sleep(5000); // request is delayed by 5000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
};
authorizer.setNext(router);
authenticator.setNext(authorizer);
return authenticator;
}