gpt4 book ai didi

reSTLet - 最大线程数问题

转载 作者:行者123 更新时间:2023-12-04 21:46:54 25 4
gpt4 key购买 nike

首先,我检查了关于这个问题的讨论,但找不到我的问题的答案,这就是我打开这个问题的原因。

我已经使用reSTLet 2.0.15 设置了一个Web 服务。该实现仅适用于服务器。与服务器的连接是通过网页进行的,因此我没有使用 ClientResource。

线程池耗尽问题的大多数答案都建议包含
#exhaust + #release
web service的过程可以说是一个函数。接收GET来自网页的请求、查询数据库、以 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();

这些参数是本论坛中讨论的结果,并由我进行修改以试图最大限度地提高效率。

来到Application,代码如下:
@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 method因为它使进程崩溃并发出警告 WARNING: 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的增加value 似乎只会推迟结果。
Example: INFO: Worker service tasks: 0 queued, 10 active, 17 completed, 27 scheduled.
Restlet version 可能存在一些错误,但我下载了稳定版本以验证这不是问题。Web 服务每天有大约 5000 个请求,这并不多。 注: #release method 的插入要么在 ServerResource or OriginFilter返回错误和引用的警告 ("WARNING: A response with a 200 (Ok) status should have an entity (...)")
请指导。
谢谢!

最佳答案

通过阅读本文 site通过将 ReSTLet 发行版升级到 2.1 version 解决了我描述的服务器端问题。 .
您将需要更改一些代码。您应该咨询各自的migration guide .

关于reSTLet - 最大线程数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com