Spring Boot Ehcacheの例

1. 概要

Spring BootでEhcacheを使用する例を見てみましょう。 これはhttps://www.jcp.org/en/jsr/detail?id=107[JSR-107]キャッシュマネージャーの実装を提供するため、Ehcacheバージョン3を使用します。
この例は、数値の2乗を生成する単純なRESTサービスです。

2. 依存関係

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.1.1.RELEASE</version></dependency>
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.6.2</version>
</dependency>

3. 例

サービスを呼び出して数値を二乗し、結果をJSON文字列として返す簡単なRESTコントローラーを作成しましょう。
@RestController
@RequestMapping("/number", MediaType.APPLICATION_JSON_UTF8_VALUE)
public class NumberController {

    // ...

    @Autowired
    private NumberService numberService;

    @GetMapping(path = "/square/{number}")
    public String getSquare(@PathVariable Long number) {
        log.info("call numberService to square {}", number);
        return String.format("{\"square\": %s}", numberService.square(number));
    }
}
それでは、サービスを作成しましょう。
Springがキャッシュを処理するように、メソッドに_ @ Cacheable_アノテーションを付けます。 *このアノテーションの結果として、Springは_NumberService_のプロキシを作成して、_square_メソッドへの呼び出しをインターセプトし、Ehcacheを呼び出します。*
使用するキャッシュの名前と、オプションでキーを指定する必要があります。 キャッシュするものを制限する条件を追加することもできます。
@Service
public class NumberService {

    // ...
    @Cacheable(
      value = "squareCache",
      key = "#number",
      condition = "#number>10")
    public BigDecimal square(Long number) {
        BigDecimal square = BigDecimal.valueOf(number)
          .multiply(BigDecimal.valueOf(number));
        log.info("square of {} is {}", number, square);
        return square;
    }
}
最後に、メインのSpring Bootアプリケーションを作成しましょう。
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. キャッシュ構成

Springの注釈駆動型キャッシュ管理を有効にするには、Springの_ @ EnableCaching_注釈をSpring Beanに追加する必要があります。
_CacheConfig_クラスを作成しましょう:
@Configuration
@EnableCaching
public class CacheConfig {
}
  • Springの自動構成は、EhcacheのJSR-107の実装を検出します。 ただし、デフォルトではキャッシュは作成されません。*

    SpringもEhcacheもデフォルトの_ehcache.xml_ファイルを検索しないためです。 次のプロパティを追加して、Springに場所を知らせます。
spring.cache.jcache.config=classpath:ehcache.xml
_squareCache:_というキャッシュを持つ_ehcache.xml_ファイルを作成しましょう
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.ehcache.org/v3"
    xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
    xsi:schemaLocation="
            http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

    <cache alias="squareCache">
        <key-type>java.lang.Long</key-type>
        <value-type>java.math.BigDecimal</value-type>
        <expiry>
            <ttl unit="seconds">30</ttl>
        </expiry>

        <listeners>
            <listener>
                <class>com.baeldung.cachetest.config.CacheEventLogger</class>
                <event-firing-mode>ASYNCHRONOUS</event-firing-mode>
                <event-ordering-mode>UNORDERED</event-ordering-mode>
                <events-to-fire-on>CREATED</events-to-fire-on>
                <events-to-fire-on>EXPIRED</events-to-fire-on>
            </listener>
        </listeners>

        <resources>
            <heap unit="entries">2</heap>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

</config>
また、_CREATED_と_EXPIRED_の両方のキャッシュイベントを記録するキャッシュイベントリスナーを追加しましょう。
public class CacheEventLogger
  implements CacheEventListener<Object, Object> {

    // ...

    @Override
    public void onEvent(
      CacheEvent<? extends Object, ? extends Object> cacheEvent) {
        log.info(/* message */,
          cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue());
    }
}

5. 実行中

mvn spring-boot:runを実行して、Mavenを使用してこのアプリを起動できます。
次に、ブラウザーを開き、ポート8080でRESTサービスにアクセスします。
http:// localhost:8080 / number / square / 12、_にアクセスすると、_ \ {“ square”:144} _が返され、ログに次のように表示されます。
INFO [nio-8080-exec-1] c.b.cachetest.rest.NumberController : call numberService to square 12
INFO [nio-8080-exec-1] c.b.cachetest.service.NumberService : square of 12 is 144
INFO [e [_default_]-0] c.b.cachetest.config.CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144
_NumberService_の_square_メソッドからのログメッセージと、EventLoggerからの_CREATED_イベントを確認できます。 *その後、ブラウザを更新すると、ログに追加されたものは次のようになります:*
INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12
_NumberService_の_square_メソッドのログメッセージは呼び出されていません。 これは、キャッシュされた値が使用されていることを示しています。
*キャッシュされたアイテムの有効期限が切れてブラウザが更新されるまで30秒待機すると、_EXPIRED_イベントが表示され、値がキャッシュに追加されます:
INFO [nio-8080-exec-1] (...) NumberController : call numberService to square 12
INFO [e [_default_]-1] (...) CacheEventLogger : Cache event EXPIRED for item with key 12. Old value = 144,New value = null
INFO [nio-8080-exec-1] (... )NumberService : square of 12 is 144
INFO [e [_default_]-1] (...) CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144
http:// localhost:8080 / number / square / 3 [_http:// localhost:8080 / number / square / 3_]をブラウザに入力すると、正しい答え9が返されますが、値はキャッシュされません。
これは、10より大きい数値の値のみをキャッシュするために_ @ Cacheable_アノテーションで使用した条件のためです。

6. 結論

このクイックチュートリアルでは、Spring BootでEhcacheを設定する方法を示しました。
いつものように、コードhttps://github.com/eugenp/tutorials/tree/master/spring-ehcache [GitHubにあります]。