1

私は、Javaリッチクライアントとリモートオブジェクト永続サーバーを使用してカイエンプロジェクトを開発しています。私が金持ちのcientがローカルホスト上の同じマシンにデプロイされているCayenne-ROP-Serverに接続している場合(cayenne ropチュートリアルで説明されているようにMavenゴールからJettyに)すべてが正常です:

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を非ローカルホスト(ubuntuのTomcat7)に変更すると、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.

ApacheTomcatログのサーバー側の出力は次のとおりです。

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、Java7SDKを使用しています

すべてのヘルプについて事前にTHX

PS。たぶん、ローカルのJettyサーバーは、リモートのUNIXマシン上のTomcatサーバーとは別の方法で処理します。

編集:以下の回答でAndrusによって与えられたヒントの後に、次のような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());
}

したがって、このlisternは、この質問の上に4行のコードstatetを実行すると、次の出力を返します。

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サーバーにアクセスするためのクライアント側の標準の初期化コードは何ですか。カイエンropチュートリアルで与えられたものとは異なりますか?

事前にTHX。

編集:このエラーを取り除くことを望んでカイエン3.1B1にアップグレードしましたが、クエリを送信しようとしたときの同じ状況:「セッションなし...」。

また、ローカルホストにTomcatをセットアップし、リモートと同じように構成しました。クエリを送信しようとすると、ここで「セッションがありません...」と同じ問題が発生します。

したがって、ローカルホスト上のJettyは、上から4行の初期化コードを取得し、後続のすべてのクエリのセッションを保持する唯一のJettyです。これが私の質問です。この惑星の誰かがTomcatにカイエンropサーバーをデプロイしようとして成功したことはありますか?

すべての小さなヒントのために事前にTHX。

編集:それで、ローカルtomcat7でサーバー側のデバッグを少し行いました。

1.クライアントは上記のコードの2行目を実行します。

DataChannel channel = new ClientChannel(clientConnection);

サーバーサイドでセッションリスナーがトリガーされ、IDが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);
}

このメソッドの1行目で新しいセッションが作成されます。そのIDはECC4A81D6240A1D04DA0A646200C4CE6です。この新しいセッションには、属性が1つだけ含まれています。キーは「org.apache.cayenne.remote.service.HttpRemoteService.ServerSession」で、値は(誰が推測したのですか?)ステップ1で前に作成したセッションです。新しいセッションが作成されても、serveltListenerはトリガーされません。

3.クライアントは4行目を上から実行します

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

サーバーサイドでは、getServerSession()メソッドが再度呼び出されます。今回も新しいセッションが作成されます(なぜですか?)。また、このセッションには属性が含まれていません。したがって、「return(ServerSession)httpSession.getAttribute(SESSION_ATTRIBUTE);」という行があります。メソッド内でgetServerSession()はnullを返し、これにより「リクエストに関連付けられたセッションがありません」という例外がトリガーされます。

では、なぜカイエンのサーバーサイドがe neセッションを作成し、以前に作成された古いセッションを使用しないのでしょうか。クエリ内でセッションを明示的に送信する必要がありますか?

編集:上から4行のコードを実行しながら、netbeanshttp-monitorからスクリーンショットを作成しました。 httpモニターTomcatcayenne

4

1 に答える 1

1

これは、CayenneROPと新しいコンテナの間の問題です。

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

これがTomcatソリューションです-次の内容でcontext.xmlファイルを作成し、それをWebアプリケーションのMETA-INF/に配置します。

<Context>
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
        changeSessionIdOnAuthentication="false" />
</Context>
于 2012-09-07T20:06:06.217 に答える