SpringBoot 3.1 to 3.2 メモ

SpringBoot 3.2がGAとなりました。
Release Notesを参考に3.1系からの変更点をまとめます
自分が移行するときに関係のあるものや興味があるものが中心となりますがご容赦ください🙇‍♂️

関連記事はこちら

SpringBoot Updateまとめ

アプリケーション名がデフォルトでログ出力

spring.application.nameで設定したアプリケーション名がデフォルトでログ出力されるようです。

地味ですが、ログ監視をしている場合にはログフォーマットが変わって監視が動かなくなるかもな修正なので注意が必要です。

設定と実際のログのサンプルです。

spring.application.name: springboot-sample
2023-11-25T16:03:12.305+09:00  INFO 97993 --- [springboot-sample] [           main] h.springboot.ApachepulsarApplication     : Started Application in 1.997 seconds (process running for 2.207)

ログ出力を無効にしたい場合は logging.include-application-name: falseを設定すればOK。

仮想スレッドをサポート(新機能)

Java21でリリースされた仮想スレッドがサポートされました。

Javaの話になってしまうのでざっくりですが、

  • プラットフォームスレッド(既存のスレッド)は、OSのスレッドと1対1で紐づいていた
    →仮想スレッドでは、JVMがスレッドを生成
  • OSの制約を受けないので、スケーラビリティが向上
  • (いろいろな記事を拝見した感じ、、、)CPUやメモリ効率も向上

という効果があるようです!

Javaを素で使う場合はこのように使用します。

Thread.startVirtualThread(() -> {
    // スレッドで実行したい処理
    // バーチャルスレッドで実行されているのかどうかは、isVirtualで確認可能
    log.info("isVirtual: {}", Thread.currentThread().isVirtual());
});

SpringBootで利用したい場合は、Java21以降でspring.threads.virtual.enabledプロパティにtrueを設定すればOKです!

spring:
  threads:
    virtual:
      enabled: true

どういったアプリケーションで有効か?というと基本的にはスレッドをたくさん生成して処理をするアプリケーションになると思うので

  • Tomcatでスレッド数を大きくして大量の処理を捌いている
  • @Async等で非同期処理を多く実装している

というようなアプリケーションでは導入を検討してみる価値があるのではないでしょうか!?

仮想スレッドが有効かどうかでBeanを使い分け

ConditionalOnThreadingというアノテーションで、仮想スレッドが有効になっているかどうかでBeanを生成し分けることができます!

@Component
@ConditionalOnThreading(Threading.VIRTUAL) // 仮想スレッドが有効な場合
//@ConditionalOnThreading(Threading.PLATFORM) // 仮想スレッドが無効な場合

RestClientをサポート(新機能)

これはRestTemplateに変わるもので、ブロッキングなHTTPリクエストをWebClientライクに実装できるものです。

RestTemplateはメンテナンスモード(追加の機能開発はストップ)となっていたので、これから開発するWebMvcアプリケーションではRestClientを使う選択肢になるのかなと思います。

詳細はこちらの記事をご覧ください!

【SpringBoot 3.2で登場!】RestClientの使い方

Apache Pulsarをサポート(新機能)

Apache Pulsarが利用可能になりました。

利用にはspring-boot-starter-pulsarの依存が必要です。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-pulsar'
}

次に接続情報をapplication.yml or application.propertiesに記載します。

spring:
  pulsar:
    client:
      # 接続先を指定
      service-url: "pulsar://localhost:6650"
      # 認証情報を指定
      # 参考:https://docs.spring.io/spring-pulsar/reference/reference/pulsar.html#client-authentication)
      authentication:
        plugin-class-name: org.apache.pulsar.client.impl.auth.AuthenticationBasic
        param:
          userId: superuser
          password: admin

メッセージ送信

メッセージを送信するには PulsarTemplateを利用します。

HTTPリクエストを受け取って裏でメッセージを送信するシンプルな例です。

@RestController
@RequiredArgsConstructor
public class SampleController {
    // ジェネリクスにはメッセージのmodelクラスを設定
    private final PulsarTemplate<String> pulsarTemplate;

    @GetMapping("/pulsar/send")
    @SneakyThrows
    public Object sendMessage() {
        // 第一引数:トピック
        // 第二引数:メッセージ
        return this.pulsarTemplate.send("someTopic", "Hello");
    }
}

メッセージ受信

メッセージを受信するには、@PulsarListenerを付与したメソッドを実装します。

@Slf4j
@Component
public class SampleReceiver {
    // トピック名は送信側と合わせる
    @PulsarListener(topics = "someTopic")
    public void processMessage(
            String content // modelクラスも指定可能
    ) {
        log.info("receipt message: {}", content);
    }
}

spring-cloud-streamで利用

spring-cloud-streamでも利用可能なようです。※検証できたら追記。。。

@Timed, @Countedの利用が便利に

@Timed@Countedアノテーションが、micrometerとaopが依存にあれば設定不要で使えるようになりました。
※以前はBean登録が必要でした。

以下の依存があれば大丈夫です!

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-aop'
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です