Apache Cayenne ROP Server Нет сеанса, связанного с запросом. на Томкат 7

Я разрабатываю проект cayenne с многофункциональным клиентом Java и удаленным сервером сохранения объектов. Если богатый cient подключается к Cayenne-ROP-Server, который развернут на том же компьютере на локальном хосте (на Jetty из цели maven, как описано в руководстве по cayenne rop), все в порядке:

ClientConnection clientConnection = new HessianConnection("http://localhost:8080/rop.server   /cayenne-service",
            "cayenne-user", "secret", SHARED_CAYENNE_SESSION_NAME);
DataChannel channel = new ClientChannel(clientConnection);
ObjectContext context = new CayenneContext(channel);
List<Object> someEntities = context.performQuery(allMovies);

Если я изменю URL-адрес, к которому я хочу подключиться, в первой строке на нелокальный хост (Tomcat7 в Ubuntu), тогда все будет работать, пока не дойдет до 4-й строки:

List<Object> someEntities = context.performQuery(allMovies);

Затем я получаю сообщение об ошибке «Нет сеанса, связанного с запросом».

Вот полный вывод клиента:

Running de.pss.hdlist.client.dataservice.MovieDataServiceCayenneImplTest
Sep 07, 2012 10:21:37 AM org.apache.cayenne.remote.hessian.HessianConnection connect
INFO: Connecting to [cayenne-user:*******@http://comunity-server.hopto.org:8080    /rop.server-3.0.2/cayenne-service] - shared session 'global-cayenne-session'
Sep 07, 2012 10:21:40 AM org.apache.cayenne.remote.hessian.HessianConnection connect
INFO: === Connected, session:  org.apache.cayenne.remote.RemoteSession@12241e[sessionId=C47DD36ACE2A043401C8D0C44D5BD8C3,n    ame=global-cayenne-session] - took 3182 ms.
Sep 07, 2012 10:21:53 AM org.apache.cayenne.remote.BaseConnection sendMessage
INFO: --- Message 0: Bootstrap
Sep 07, 2012 10:21:53 AM org.apache.cayenne.remote.BaseConnection sendMessage
INFO: === Message 0: Bootstrap done - took 406 ms.
Sep 07, 2012 10:21:53 AM org.apache.cayenne.remote.BaseConnection sendMessage
INFO: --- Message 1: Query
Sep 07, 2012 10:21:53 AM org.apache.cayenne.remote.BaseConnection sendMessage
INFO: *** Message error for 1: Query - took 187 ms.

Вот вывод журнала Apache Tomcat на стороне сервера:

WARNING: org.apache.cayenne.remote.service.MissingSessionException: [v.3.0.2 Jun 19 2011 09:29:50] No session associated with request.
org.apache.cayenne.remote.service.MissingSessionException: [v.3.0.2 Jun 19 2011 09:29:50] No session associated with request.
    at    org.apache.cayenne.remote.service.BaseRemoteService.processMessage(BaseRemoteService.java:148)
    at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:180)
    at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:109)
    at com.caucho.hessian.server.HessianServlet.service(HessianServlet.java:396)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:679)

Я использую Apache Cayenne 3.0.2, Apache-Tomcat 7.0.29 и Java 7 SDK.

THX заранее за каждую помощь

PS. Возможно, локальный сервер Jetty обрабатывает вещи по-другому, чем сервер Tomcat на удаленной машине unix.

Редактировать: после подсказки, данной Андрусом в ответе ниже, я добавил SessionListern, который выглядит следующим образом:

public class HttpSessionListenerLogImpl implements HttpSessionListener {

private final static Logger LOGGER = Logger.getLogger(HttpSessionListenerLogImpl.class.getName());

@Override
public void sessionCreated(HttpSessionEvent hse) {
    LOGGER.log(Level.SEVERE,
            "!__Session created with ID: " + hse.getSession().getId());
    LOGGER.log(Level.SEVERE, "!__Session created by: " + hse.getSource());
    LOGGER.log(Level.SEVERE, "!__Session Attributes: " + hse.getSession().getAttributeNames());
    LOGGER.log(Level.SEVERE, "!__Session max inactivity: " + hse.getSession().getMaxInactiveInterval());
    LOGGER.log(Level.SEVERE, "!__Session context: " + hse.getSession().getServletContext().getServletContextName());
}

@Override
public void sessionDestroyed(HttpSessionEvent hse) {
    LOGGER.log(Level.SEVERE, "!__Session killed with ID: " + hse.getSession().getId());
    LOGGER.log(Level.SEVERE, "!__Session killed by: " + hse.getSource());
    LOGGER.log(Level.SEVERE, "!__Session Attributes: " + hse.getSession().getAttributeNames());
    LOGGER.log(Level.SEVERE, "!__Session max inactivity: " + hse.getSession().getMaxInactiveInterval());
    LOGGER.log(Level.SEVERE, "!__Session context: " + hse.getSession().getServletContext().getServletContextName());
}

Итак, этот слушатель дает мне следующий вывод при выполнении 4 строк кода поверх этого вопроса:

Sep 11, 2012 11:06:27 AM de.pss.hdlist.HttpSessionListenerLogImpl sessionCreated
SEVERE: !__Session created with ID: B07648A2A5F0005AF6DF0741D7EF2D21
Sep 11, 2012 11:06:27 AM de.pss.hdlist.HttpSessionListenerLogImpl sessionCreated
SEVERE: !__Session created by: org.apache.catalina.session.StandardSessionFacade@515f9553
Sep 11, 2012 11:06:27 AM de.pss.hdlist.HttpSessionListenerLogImpl sessionCreated
SEVERE: !__Session Attributes: java.util.Collections$2@5a44a5e1
Sep 11, 2012 11:06:27 AM de.pss.hdlist.HttpSessionListenerLogImpl sessionCreated
SEVERE: !__Session max inactivity: 216000
Sep 11, 2012 11:06:27 AM de.pss.hdlist.HttpSessionListenerLogImpl sessionCreated
SEVERE: !__Session context: Cayenne Tutorial
Sep 11, 2012 11:06:27 AM com.caucho.hessian.server.HessianSkeleton invoke
WARNING: org.apache.cayenne.remote.service.MissingSessionException: [v.3.0.2 Jun 19 2011 09:29:50] No session associated with request.
org.apache.cayenne.remote.service.MissingSessionException: [v.3.0.2 Jun 19 2011 09:29:50] No session associated with request.
    at  org.apache.cayenne.remote.service.BaseRemoteService.processMessage(BaseRemoteService.java:148)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at  
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:180)
    at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:109)
    at com.caucho.hessian.server.HessianServlet.service(HessianServlet.java:396)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:679)

Здесь вы можете видеть, что сеанс создается, и нет сеанса, который уничтожается. Так почему же ObjectContext из моей строки кода

List<Object> someEntities = context.performQuery(allMovies);

игнорирует сеанс. Должен ли я устанавливать его явно перед выполнением запроса? Каков стандартный код инициализации на стороне клиента для доступа к удаленно развернутому серверу cayenne. Отличается ли он от того, что приведен в руководстве по кайенскому ропу?

СПАСИБО заранее.

Изменить: я обновился до cayenne 3.1B1, надеясь избавиться от этой ошибки, но здесь та же ситуация: «Нет сеанса ...» при попытке отправить запрос.

Я также установил tomcat на локальном хосте и настроил его так же, как и удаленный. Та же проблема здесь «Нет сеанса ...» при попытке отправить запрос.

Таким образом, Jetty на локальном хосте — единственный, который берет 4-строчный код инициализации сверху и удерживает сеанс для каждого последующего запроса. Вот мой вопрос. Кто-нибудь на этой планете когда-нибудь пытался развернуть сервер cayenne rop на коте и преуспел?

Заранее спасибо за каждую маленькую подсказку.

Редактировать: Итак, я немного отладил серверную часть своего локального tomcat7.

1.Клиент выполняет строку 2 кода сверху:

DataChannel channel = new ClientChannel(clientConnection);

на стороне сервера мой прослушиватель сеансов срабатывает и сообщает мне, что сеанс был создан с идентификатором: B6565298F222294F601B76333DBE4911

2.Клиент выполняет строку 3 сверху:

ObjectContext context = new CayenneContext(channel);

На стороне сервера вызывается метод класса org.apache.cayenne.remote.service.HttpRemoteSession:

/**
 * Returns a ServerSession object that represents Cayenne-related state associated
 * with the current session. If ServerSession hasn't been previously saved, returns
 * null.
 */
@Override
protected ServerSession getServerSession() {
    HttpSession httpSession = getSession(true);
    return (ServerSession) httpSession.getAttribute(SESSION_ATTRIBUTE);
}

новый сеанс создается первой строкой этого метода. Его идентификатор: ECC4A81D6240A1D04DA0A646200C4CE6. Этот новый сеанс содержит ровно один атрибут: ключ — «org.apache.cayenne.remote.service.HttpRemoteService.ServerSession», а значение — (кто угадал?) сеанс, созданный ранее на шаге 1. Что заставляет меня задаться вопросом, что мой serveltListener не срабатывает, хотя создается новый сеанс.

3.Клиент выполняет строку 4 сверху

List<Object> someEntities = context.performQuery(allMovies);

на стороне сервера снова вызывается метод getServerSession(). На этот раз также создается новый сеанс (почему?). И этот сеанс не содержит ни одного атрибута. Итак, строка «возврат (ServerSession) httpSession.getAttribute(SESSION_ATTRIBUTE);» внутри метода getServerSession() возвращает значение null, и именно это вызывает исключение «Нет сеанса, связанного с запросом».

Так почему же на стороне сервера cayenne создается новая сессия, а не используется старая, созданная ранее? Должен ли я явно отправлять сеанс в запросе?

Редактировать: я сделал скриншоты с http-монитора netbeans, запустив четыре строки кода сверху: http monitor tomcat cayenne


person cpasemann    schedule 07.09.2012    source источник
comment
Пожалуйста, не помечайте это тегом Apache, который зарезервирован для HTTP-сервера Apache.   -  person f_puras    schedule 07.09.2012
comment
Извините за это, но я относительный нуб в этом   -  person cpasemann    schedule 07.09.2012


Ответы (1)


Это проблема между Cayenne ROP и более новыми контейнерами:

https://issues.apache.org/jira/browse/CAY-1739

Вот решение Tomcat: создайте файл context.xml со следующим содержимым и поместите его в META-INF/ вашего веб-приложения:

<Context>
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
        changeSessionIdOnAuthentication="false" />
</Context>
person andrus_a    schedule 07.09.2012
comment
Спасибо за ваш ответ. Вы написали: Самый простой способ — создать собственный javax.servlet.http.HttpSessionListener, поместить его в web.xml и заставить регистрировать каждое событие создания и уничтожения сеанса с идентификаторами сеанса, включенными в журнал. Затем вы увидите, что происходит с вашими сеансами. Поскольку я новичок в серверной части, я не знаю, как этого добиться. Можете ли вы предоставить пример кода или ссылку на пример, пожалуйста. - person cpasemann; 10.09.2012
comment
THX за ваш полезный ответ. Я добавил описанный вами слушатель. Посмотрите на мой отредактированный Вопрос. Я добавил вывод журнала. - person cpasemann; 11.09.2012
comment
Я также пытался перейти на версию 3.1B1, см. выше отредактированный вопрос. - person cpasemann; 11.09.2012
comment
Я также установил tomcat на локальном хосте, здесь та же проблема. См. отредактированный вопрос выше - person cpasemann; 12.09.2012
comment
Поэтому я немного отладил серверную часть. См. мой отредактированный вопрос выше. - person cpasemann; 12.09.2012
comment
только что добавил примечание о файлах cookie Tomcat. Либо в фабрике Cayenne HessianConnection/HessianProxy есть ошибка в отношении политик файлов cookie Tomcat 7, либо на вашем сервере есть специальная конфигурация файлов cookie. - person andrus_a; 12.09.2012
comment
Спасибо за вашу подсказку. Специальной конфигурации cookie tomcat не существует. Все по умолчанию. Я попытаюсь отладить причал и кота, чтобы определить разницу. Также было бы полезно, если бы вы отлаживали серверную часть на коте, так как я не знаю, как все это работает вместе. - person cpasemann; 13.09.2012
comment
Я добавил скриншоты с http-монитора netbeans, показывающие соответствующие http-данные. - person cpasemann; 13.09.2012
comment
Просто переписал ответ. Это проблема между ROP и более новыми контейнерами. Мы работаем над этим. и есть обходной путь, пока вы оцениваете ROP. - person andrus_a; 13.09.2012
comment
Большое спасибо за вашу работу. По крайней мере, теперь я знаю проблему. Я бы проголосовал за ваш ответ, но моя оценка репутации недостаточно высока. Я проголосую за ваш ответ, когда получу счет. Еще раз спасибо за вашу работу. - person cpasemann; 13.09.2012
comment
На самом деле я только что добавил работающее решение Tomcat (клонировал его из отчета об ошибках Cayenne, так что он сохранен здесь для записи). - person andrus_a; 15.09.2012