Служба 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