2012-05-02 9 views
2

私はJettyのセッション永続性を働かせようとしています。実際にはセッションをディスクに書き込んでいますが、アプリケーションがセッションを読むチャンスを得るまでにセッションデータがすべて消去されるため、セッションを読み込むことはできません。ジェット持続セッション - 書き込み専用?

我々はそうのようにそれを設定している:

HashSessionManager sessionManager = new HashSessionManager(); 
sessionManager.setStoreDirectory(new File("sessions")); 

// If I don't put in this next line, it seems like it "never" saves sessions to disk. 
// Or at least I don't have the patience to wait however long it must take to do so. 
sessionManager.setSavePeriod(5);//seconds 

// Supposedly if you don't turn this on it can cause problems for some of the things 
// Wicket puts in the session because Jetty would otherwise initialise the objects in 
// the session before Wicket itself initialises. 
sessionManager.setLazyLoad(true); 

// ... 
servletHandler.setSessionHandler(new SessionHandler(sessionManager)); 

ドキュメントは、私はすでに遅延読み込みを可能にすることによって、上記のコードにステップオーバーしている1を除く任意の明白な落とし穴に言及していないようです。しかし、そのクラスには他にもたくさんのセッションがあり、そのほとんどがJavadocで文書化されていないので、潜在的なバグを見つけるためにソースコードを掘り起こす以外に、ここからどこに行くのかが分かりません。

答えて

0

翌日に自分の質問に答える。セッションにカスタムのKey-Valueペアを追加しようとしましたが、それがセッションに正しく保持されていることがわかりました。そうしている間、セッションファイルのサイズが着実に増えていたことに気付きました。これは、サーバが再起動されるたびにセッション全体がパージされているように見える場合は特に珍しいようでした。

だから私はすべてのセッションデータをダンプするためにいくつかのコードを書き、Wicketのは(私はこれまでのところ得た時間だけがあった約10倍以上のキーと値のペア)は、このようなセッションで複数の値を持っていたことを発見:

 
Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1037224009=or[email protected]5b3ab386 
Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1306414591=or[email protected]33048394 
wibble=wobble 
wicket:com.acme.server.web.DispatcherServlet-1037224009:[email protected] 
wicket:com.acme.server.web.DispatcherServlet-1037224009:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-[email protected]20e39570 
wicket:com.acme.server.web.DispatcherServlet-1306414591:[email protected][id=2,name=admin,roles=[admin, user]] 
wicket:com.acme.server.web.DispatcherServlet-1306414591:roles=admin, user 
wicket:com.acme.server.web.DispatcherServlet-1306414591:[email protected] 
wicket:com.acme.server.web.DispatcherServlet-1306414591:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-[email protected]517d59d0 

これは私に "com.acme.server.web.DispatcherServlet-1037224009"という野生の検索で私を導いてくれました。それはサーブレットのgetServletName()の値であることが判明しました。 getServletName()のJavadocでは、サーブレット名はサーブレットのクラス名になりますが、Jettyの場合はではなくであることがわかります。最後には何らかの乱数も追加されます。したがって、Wicketがサーブレット名をセッションキーに入れ、JettyがAPIドキュメントに従ってサーブレット名を生成しないJetty + Wicketの特殊性が判明します。

修正プログラムはもちろん、ディスパッチャーサーブレットの既知の名前を設定するための1ライナーでした。

+0

Wicketは、1つの.warに複数のwicketアプリケーションがある可能性があるため、キーにフィルタ/サーブレット名を使用します。ちょうどwicket-examples.warのように。私は桟橋の部分にはコメントできません。 –

関連する問題