【问题标题】:Restlet after few requests generate load on CPU少数请求在 CPU 上产生负载后 Restlet
【发布时间】:2013-11-26 08:24:03
【问题描述】:

我正在创建的 API 有问题。我正在使用 Restlet 创建带有 json 响应的 API。首先,我阅读了 restlet 的文档,并使用了他们在这里介绍的简单模型:http://restlet.org/discover/firststeps

我的代码几乎相同,但有一些部分。我的 ServerResource 是这样的:

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

}

我在 db 操作中使用 gson 库创建 json 响应我有几行:

CategoriesGson json = null;
json = new CategoriesGson(a, b, c, d);
// databases operations, most getting information from database
jsonList.add(gson.toJson(json));
return jsonList.toString();

主要问题是 CPU 负载问题,当我在几次按下 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线程,我认为这是错误的。我不知道如何解决这个问题。我正在寻找这个问题,我在 github 上只找到了问题 386 和 794。如果有人知道我该如何解决,请告诉我。

【问题讨论】:

  • 当我对服务器进行多个请求时,我设法发现 CPU 使用率很高,并且当请求未正确完成时会出现此问题。

标签: java restlet


【解决方案1】:

我遇到了完全相同的错误,我只是想出了如何重现它:

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% 并保持在那个水平......

【讨论】:

  • 这里的问题一模一样,怎么办?
猜你喜欢
  • 2020-08-26
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2010-09-27
  • 2016-08-24
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多