У меня возникла проблема с ClientResource в Restlet (v 2.0.5), которая может быть следствием непонимания его правильного использования.
Я использую ClientResource с Apache HTTPКлиентский соединитель, и написал следующее:
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 не является поточно-ориентированным, и вы заметите, что в моем коде я использую executor для запуска этого раздела кода, однако, этот executorсодержит только один поток, поэтому, пока я не пойму иначе, я исключил это как проблему.
ПРИМЕЧАНИЕ 2. Javadoc ClientResource утверждает: «Примечание о параллелизме: экземпляры класса не предназначены дляразделены между несколькими потоками. Если необходима защита потоков, рассмотрите возможность использования класса клиента более низкого уровня. "Тем не менее, создатель рестлета говорит, что на самом деле он потокобезопасен, просто явно не предназначен для этой цели.Спасибо.