作成中のアプリケーションのDropwizard のversion を
1.0.6 > 1.1.2 に upgrade したところ、
コンパイルエラーが出力されました。
コンパイルエラー情報を元に、検索したところ、
以下、Jetty のupgrade 情報が該当しました。
Chapter 36. Upgrading Jetty
上記を参考にエラー発生箇所の対処を行ったので、実施した結果を記載します。
変更点について
修正前の実装
問題が出たのは、SessionHandler の設定箇所です。
もともと、Dropwizard で MongoDB session clustering を使う | Monotalk
で実装を作成した部分となります。
/**
* setSessionHandlerTo
*
* @param env
*/
private void setSessionHandlerTo(Environment env) throws UnknownHostException {
// Set SessionHandler
MongoClientURI mongoURI = new MongoClientURI(MongoDBResource.getUriString());
// Not Close...
MongoClient mongoClient = new MongoClient(mongoURI);
// 非推奨だが、ライブラリが対応していないので使う..
DB db = mongoClient.getDB("jetty_session");
DBCollection collection = db.getCollection("jetty_session_collection");
env.lifecycle().addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {
@Override
public void lifeCycleStarting(LifeCycle event) {
log.info("lifeCycleStarting start event = {}", event);
if (!(event instanceof Server)) {
return;
}
Server server = (Server) event;
MongoSessionIdManager sessionIdManager = new MongoSessionIdManager(server, collection);
MongoSessionManager sessionManager = null;
try {
sessionManager = new MongoSessionManager();
} catch (UnknownHostException e) {
throw new IllegalStateException(e);
}
sessionIdManager.setWorkerName("node1");
sessionIdManager.setScavengePeriod(1800000L);
sessionIdManager.setScavengeBlockSize(0);
sessionIdManager.setPurge(true);
sessionIdManager.setPurgeDelay(1800000L);
sessionIdManager.setPurgeInvalidAge(1800000L);
sessionIdManager.setPurgeValidAge(5400000L);
sessionIdManager.setPurgeLimit(0);
sessionManager.setSessionIdManager(sessionIdManager);
sessionManager.setPreserveOnStop(true);
sessionManager.setHttpOnly(true);
sessionManager.setMaxInactiveInterval(1800);
env.servlets().setSessionHandler(new SessionHandler(sessionManager));
}
});
}
変更点1. SessionManager が削除された
SessionManager
の が削除されて、別のクラスに機能が分割された
SessionManager
が削除された影響で、
以下のようなエラーが出力されていました。
期待値: 引数がありません
検出値: org.eclipse.jetty.nosql.mongodb.MongoSessionManager
理由: 実引数リストと仮引数リストの長さが異なります
SessionManager
が削除されて、機能がSessionHandler
に移動されているようなので、
実装を修正しました。
変更点2. Session をストレージに 登録する Module が変更された
作成しているアプリケーションは、MongoDB を Session ストレージとして使用していますが、
Jetty 9.3 では、nosql
だったのが、
Jetty 9.4 では、session-store-mongo
に変更されています。
Clustered Session Management: MongoDB
jetty コマンドを オプション指定で起動すると、jarが落ちてくるようですが、
dropwizard 経由なのでやり方がよくわかりません。
再度、
Chapter 36. Upgrading Jetty
を確認したところ、以下の記載を見つけました。
SessionIdManager Previously there was a different class of SessionIdManager - with different configuration options - depending upon which type of >clustering technology chosen. In Jetty 9.4, there is only one type, the org.eclipse.jetty.server.session.DefaultSessionIdManager.
DefaultSessionIdManager
を使うと変更ができそうだったので、そちらを使用するように変更しました。
変更点3. 修正はし、コンパイルは通ったが、起動しない。
コンパイルは通るようになりましたが、 以下メッセージが出力され、 server コマンドで、起動しても途中で止まるようになりました。
org.eclipse.jetty.nosql.mongodb.MongoSessionDataStoreFactory.getSavePeriodSec()I
どうも、jetty
の version と、session-store-mongo
が噛み合っておらず、
session-store-mongo
のほうが新しかったため発生していました。
修正後の実装
修正後の実装は以下のようになりました。
いくつか、MongoSessionIdManager
から削除されたが、DefaultSessionIdManager
には存在しないオプションがあり、
どうやって指定するのかわからないものがありますが、動作はするようになりました。
/**
* setSessionHandlerTo
*
* @param env
*/
private void setSessionHandlerTo(Environment env) throws UnknownHostException {
env.lifecycle().addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {
@Override
public void lifeCycleStarting(LifeCycle event) {
log.info("lifeCycleStarting start event = {}", event);
if (!(event instanceof Server)) {
return;
}
Server server = (Server) event;
MongoSessionDataStoreFactory storeFactory = new MongoSessionDataStoreFactory();
storeFactory.setHost(MongoDBResource.getHost());
storeFactory.setPort(Integer.valueOf(MongoDBResource.getPort()));
storeFactory.setDbName("jetty_session");
storeFactory.setCollectionName("jetty_session_collection");
storeFactory.setGracePeriodSec(3600);
server.addBean(storeFactory);
DefaultSessionIdManager sessionIdManager = new DefaultSessionIdManager(server);
sessionIdManager.setServer(server);
sessionIdManager.setWorkerName("node1");
SessionHandler handler = new SessionHandler();
handler.setHttpOnly(true);
handler.setMaxInactiveInterval(1800);
handler.setSessionIdManager(sessionIdManager);
server.setSessionIdManager(sessionIdManager);
env.servlets().setSessionHandler(handler);
}
});
}
pom.xml の記載
9.3.16.v20170120
から、9.4.2.v20170220
へ、jetty-nosql のversion を変更しました。
名前は変わったけど、artifactId はそのままのようです。
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-nosql</artifactId>
<version>9.4.2.v20170220</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
</exclusion>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>test-sessions-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jmx</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
以上です。
コメント