我在Restlet(v 2.0.5)中遇到ClientResource的问题,这可能是由于不了解其正确用法所致。
我正在使用ClientResource和Apache HTTP Client连接器,并编写了以下内容:
private final ClientResource httpClient;
public SendClient(String uri) {
httpClient = new ClientResource(uri);
}
// Omitted code would create messages to send, and then use an executor
// to send this particular message to its destination.
public void run() {
ClientResource sendClient = null;
try {
sendClient = wsClient.getChild(uriResource); // re-use original httpclient instance, uriResource is passed in to the method that calls this.
sendClient.post(form);
} catch (Throwable e) {
logger.error("Unable to send message, {}", e.getMessage());
} finally {
if (sendClient != null) {
sendClient.release(); // As I understand from [Restlet WIKI][1]
}
}
}
这个对吗?我怀疑不是这样,因为几个小时(7个或更多)后,此部分代码开始引发以下错误“内部服务器错误”,并且目标不再接收消息。
关于我做错了什么的任何想法?
注意:我知道ClientResource并非线程安全的,您会注意到在我的代码中我使用执行程序来运行此部分代码,但是,该执行程序仅包含一个线程,因此,直到我了解其他情况为止,我已经排除了这个问题。
注2:ClientResource Javadoc指出:“并发注释:该类的实例并非设计为在多个线程之间共享。如果需要线程安全,请考虑使用较低级别的Client类。”但是,restlet创建者说,实际上它是线程安全的,只是没有明确为此目的而设计。
谢谢。
最佳答案
ClientResource是线程安全的,但是即使有可能,它也不是专门为由多个并发线程使用而设计的。但是,多次重用同一实例是完全有效的。
回到您的问题,我们将需要对您的问题进行更详细的堆栈跟踪以寻求帮助,因为“内部服务器错误”会导致服务器端而不是客户端端出现问题。
希望这可以帮助,
杰罗姆