我在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是线程安全的,但是即使有可能,它也不是专门为由多个并发线程使用而设计的。但是,多次重用同一实例是完全有效的。

回到您的问题,我们将需要对您的问题进行更详细的堆栈跟踪以寻求帮助,因为“内部服务器错误”会导致服务器端而不是客户端端出现问题。

希望这可以帮助,
杰罗姆

09-11 19:22