Ошибка внутреннего соединителя (1002) — время ожидания вызывающего потока истекло во время ожидания ответа для его разблокировки

#java #node.js #post #https #restlet

#java #node.js #Публикация #https #restlet

Вопрос:

У меня есть приложение Java 1.8, которое пытается связаться с приложением node версии 8.10. Оба работают на одном и том же сервере (AWS EC2 ubuntu 18.04). Java-приложение выполняется в контейнере tomcat 8 с https на порту 8443. Приложение узла запущено в контейнере pm2 версии 4.4.1, также использующем https, на порту 8888.

Приложение Java вызывает маршрут приложения узла, используя POST с некоторыми параметрами тела запроса.

Все работает нормально, если я отправляю запрос с помощью postman или подключаю свой локальный java-сервер разработки к приложению prod node. Но когда оба выполняются на сервере prod, у меня возникает эта ошибка :

 Internal Connector Error (1002) - The calling thread timed out while waiting for a response to unblock it.
    at org.restlet.resource.ClientResource.handle(ClientResource.java:870)
    at org.restlet.resource.ClientResource.post(ClientResource.java:1209)
    ...
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
  

вот репозиторий maven, который я использую:

 <dependency>
   <groupId>org.restlet.jee</groupId>
   <artifactId>org.restlet</artifactId>
   <version>2.0.14</version>
</dependency>
  

Вот код на стороне Java:

         Form form = new Form();
        Client client = null;
        ClientResource resource = null;
        Representation response = null;
        form.add("something", "somevalue");

    try {
        client = new Client(new Context(), Protocol.HTTPS);
        resource = new ClientResource(resourceURI);
        resource.setNext(client);
        response = resource.post(form.getWebRepresentation());
    } finally {
        try {
            response.exhaust();
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
        response.release();
        resource.release();
    }

  

Комментарии:

1. К вашему сведению, я попытался сделать то же самое с Apache HttpClient, и у меня тот же результат: я могу связаться с сервером узла prod со своего локального компьютера разработчика, но я получаю тайм-аут, когда java-клиент также находится на prod… Кажется, они не могут взаимодействовать друг с другом, если они оба находятся на одном сервере… даже если они не используют один и тот же порт…

2. К вашему сведению, я попробовал с помощью простого запроса cURL: он работает, если я запускаю его на своем локальном компьютере, и он завершается с ошибкой (тайм-аут), если я запускаю его на сервере (через консоль ssh)…

3. Попробуйте gitter.im/restlet-framework/community

Ответ №1:

решение состоит в том, чтобы отредактировать файл /etc/hosts на стороне сервера и добавить DNS в определение локального хоста. Таким образом, разрешение DNS выполняется локально, без повторного подключения к Интернету и повторного подключения к серверу AWS, что, по-видимому, блокирует ситуацию.

 sudo nano /etc/hosts
127.0.0.1 localhost www.mysite.xyz