環境
- SpringBoot 2.3.0
- Infinispan 10.1.7
サンプルソースはこちら
GitHub - chiroito/spring-session-sample
手順
Java EE がインフラの設定だけで実現できることと比べ、SpringBoot はアプリ側を少し書き換えて設定しないと行けません。
手順は以下のとおりです。
- セッションを使ったアプリを書く
- プロジェクトに依存関係を追加
- アプリケーションにアノテーションを追加
- アプリに Infinispan へ接続する設定を追加
0. Infinispan を起動
今回は 2 ノードの Infinispan を起動します。 ダウンロードした Infinispan の zip を 2 回別の名前で解凍します。 普通に実行すると使用しているポートが被ってしまいます。それを回避するため引数に-Dinfinispan.socket.binding.port-offset
を付与します。それぞれのディレクトリで次の様に実行します。
1 つ目
bin\server.bat -Dinfinispan.node.name=nodeA
2 つ目
bin\server.bat -Dinfinispan.node.name=nodeB -Dinfinispan.socket.binding.port-offset=100
1. セッションを使ったアプリを書く
アプリはセッションを使ったものを普通に書くだけです。Infinispan にセッションをレプリケーションするかどうかで特に違いはありません。以下はセッション情報となるカウンターとそれを使ったエンドポイントのアプリです。
Counter.java
import org.springframework.stereotype.Component; import org.springframework.web.context.annotation.SessionScope; import java.io.Serializable; @SessionScope @Component public class Counter implements Serializable { private static final long serialVersionUID = 1L; private int value; public int getValue() { return value; } public void countUp(){ this.value++; } }
CountEndpoint.java
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/session") public class CountEndpoint { private final Counter counter; public CountEndpoint(Counter counter) { this.counter = counter; } @GetMapping("/count") public String count(){ counter.countUp(); return "counter=" + counter.getValue(); } @GetMapping("/read") public String read(){ return "counter=" + counter.getValue(); } }
2. プロジェクトに依存関係を追加
プロジェクトの依存関係に Spring Session の実装への依存関係を追加しないといけません。今回はセッションの格納先に Infinispan を使用するので Infinispan への依存関係を追加します。
<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-bom</artifactId> <version>10.1.7.Final</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-spring-boot-starter</artifactId> <version>2.2.4.Final</version> </dependency> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-spring-boot-starter-remote</artifactId> <version>2.2.4.Final</version> </dependency>
3. アプリケーションにアノテーションを追加
キャッシュを使えるようにするのと Infinispan のクラスタにセッションを入れられるようにするため、SpringBootのアプリケーションには 2 つのアノテーションを追加します。追加するアノテーションは@EnableCaching
と@EnableInfinispanRemoteHttpSession
です。
@EnableCaching @EnableInfinispanRemoteHttpSession @SpringBootApplication public class InfinispanSessionApplication { public static void main(String[] args) { SpringApplication.run(InfinispanSessionApplication.class, args); } }
実行
最後に実行しましょう。SpringBoot を通常どおり実行するだけです。