Служба REST Neo4j не может быть сохранена при развертывании в WebLogic

У меня проблема со следующей настройкой:

  • База данных Neo4j 1.9.4 с сервисом REST
  • Веб-приложение для подключения к указанному сервису REST, построенное на основе Spring Data Neo4j 2.3.1.RELEASE. Другие технологии не заслуживают внимания, стоит отметить, что переходная зависимость SDN находится на уровне 1,9. Увидеть ниже.
  • Указанное веб-приложение развернуто в WebLogic для производства, Tomcat используется для локальной разработки.

Выдержка из дерева зависимостей Maven

    [INFO] +- org.springframework.data:spring-data-neo4j-rest:jar:2.3.1.RELEASE:compile
    [INFO] |  +- org.neo4j:neo4j-rest-graphdb:jar:1.9:compile
    [INFO] |  |  \- org.neo4j:server-api:jar:1.9:compile
    [INFO] |  |     +- org.neo4j.3rdparty.javax.ws.rs:jsr311-api:jar:1.1.2.r612:compile
    [INFO] |  |     +- commons-configuration:commons-configuration:jar:1.6:compile
    [INFO] |  |     |  \- commons-beanutils:commons-beanutils-core:jar:1.8.0:compile
    [INFO] |  |     \- commons-digester:commons-digester:jar:1.8.1:compile
    [INFO] |  |        \- commons-beanutils:commons-beanutils:jar:1.8.0:compile

Проблема в том, что API сохранения SDN не работает при развертывании в WebLogic. Веб-приложение по-прежнему не имеет проблем при попытке получить какие-либо @NodeEntity, Но когда приложение пытается сохранить (список API, которые я пробовал ниже), оно всегда выдает ошибку.

Что я пробовал (оба дают одинаковый результат, ошибка):

    repository.save(U entity);
    neo4jTemplate.save(T entity);

Странные вещи, которые я заметил:

  • Когда мое приложение подключается к серверу Neo4j через
    GraphDatabaseFactory.databaseFor(url) это работает, я могу сохранить на Node (@NodeEntity SDN до сих пор не работает). При подключении через new SpringRestGraphDatabase(restUri) и то и другое Node а также @NodeEntity не работает Оба API возвращают потомков org.neo4j.graphdb.GraphDatabaseService
  • Это легко воспроизвести даже в локальной среде. Я предполагал, что это проблема с сетью, но когда я попытался установить и сервер Neo4j, и сервер WebLogic на моем локальном компьютере, проблема все еще проявляется.
  • Я думал, что это транзакционная проблема, так как поиск не имеет проблем, но, как упоминал Майкл Хангер, в Neo4j Server нет реальных транзакций. Так что это не должно вызывать проблемы.

Трассировки стека:

    ]] Root cause of ServletException.
    com.sun.jersey.api.client.ClientHandlerException: java.net.SocketTimeoutException: Read timed out
            at com.sun.jersey.api.client.ClientResponse.close(ClientResponse.java:603)
            at org.neo4j.rest.graphdb.RequestResult.extractFrom(RequestResult.java:83)
            at org.neo4j.rest.graphdb.ExecutingRestRequest.put(ExecutingRestRequest.java:151)
            at org.neo4j.rest.graphdb.ExecutingRestAPI.setPropertyOnEntity(ExecutingRestAPI.java:340)
            at org.neo4j.rest.graphdb.RestAPIFacade.setPropertyOnEntity(RestAPIFacade.java:135)
            Truncated. see log file for complete stacktrace
    Caused By: java.net.SocketTimeoutException: Read timed out
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.read(SocketInputStream.java:129)
            at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
            at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
            at weblogic.net.http.KeepAliveStream.close(KeepAliveStream.java:115)
            Truncated. see log file for complete stacktrace
    >

В Tomcat все отлично работает (как REST, так и Embedded).
Все отлично работает в Embedded db (даже в WebLogic).

Любая помощь с благодарностью.

1 ответ

Решение

Это исключение бросить в com.sun.jersey.api.client.ClientResponse

/**
     * Close the response.
     * <p>
     * The entity input stream is closed.
     *
     * @throws ClientHandlerException if there is an error closing the response.
     */
    public void close() throws ClientHandlerException {
        try {
            entity.close();
        } catch (IOException e) {
            throw new ClientHandlerException(e);
        }
    }

К этому времени реализацией InputStream в Weblogic 12 является weblogic.net.http.KeepAliveStream
Код 204 возвращает No Content, затем weblogic помечает его как незавершенную загрузку содержимого.

Решением здесь является использование -DUseSunHttpHandler=true при запуске weblogic (bin/startWebLogic.cmd)

set JAVA_OPTIONS=%JAVA_OPTIONS% -DUseSunHttpHandler=true

С Уважением,
Tung

Другие вопросы по тегам