5

まず、この問題に関する議論を確認しましたが、問題に対する答えが見つかりませんでした。そのため、この質問を開きます。

レストレット2.0.15を使用してWebサービスをセットアップしました。実装はサーバー専用です。サーバーへの接続はWebページを介して行われるため、ClientResourceは使用しませんでした。

スレッドプールの問題の枯渇に対する答えのほとんどは、

#exhaust + #release

Webサービスのプロセスは、単一の関数として説明できます。WebGETページから要求を受け取り、データベースにクエリを実行し、結果をXMLでフレーム化して、最終的な表現を返します。フィルタを使用して、beforeHandleとafterHandleをオーバーライドしました。

コンポーネント作成コードのコード:

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 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 methodWARNING: A response with a 200 (Ok) status should have an entity (...)

ServerResource実装のコードは次のとおりです。

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

}

}

他のスレッドで提供されているソリューションを試しましたが、どれも機能していないようです。まず、スレッドプールがとして設定されたパラメータで拡張されていないようです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、安定したバージョンをダウンロードして、これが問題ではないことを確認しました。Webサービスには1日あたり約5000のリクエストがあり、それほど多くはありません。注:リターンエラーと参照された警告に#release methodどちらかを挿入しますServerResource or OriginFilter("WARNING: A response with a 200 (Ok) status should have an entity (...)")

ご案内ください。ありがとう!

4

1 に答える 1

1

このサイトを読んで、私が説明したサーバー側の問題は、Restlet ディストリビューションを2.1 バージョンにアップグレードすることで解決されました。一部のコードを変更する必要があります。それぞれの移行ガイドを参照してください。

于 2012-10-19T21:57:12.080 に答える