新着情報

Spring Integration にすでに精通している方のために、この章ではバージョン 7.0 の新機能の概要を簡単に説明します。

以前のバージョンで導入された変更と機能に興味がある場合は、変更履歴を参照してください。

Spring Integration 7.0 の新機能

詳細については、7.0 開発プロセスの一環として解決された GitHub の課題 (英語) を参照してください。

全体的に、プロジェクトは最新の依存関係バージョンに移行しました。Java 17 は引き続きベースラインですが、Java 24 もサポートされています。

一般的な変更

Junit 4 ベースのサポートコンポーネントは非推奨です。

このプロジェクトでは、JSpecify (英語) アノテーションを活用して null セーフ API を公開し、ビルドの一部として NullAway [GitHub] (英語) を使用して null 可能性宣言の一貫性をチェックするようになりました。

spring-retry への依存関係とそのすべての API 使用は、Spring Framework コアモジュールの retry API に置き換えられました。この変更は、Spring ポートフォリオ全体における自然な進化です。一般的に、以下の参照が移行されました。

  • org.springframework.retry.support.RetryTemplate → org.springframework.core.retry.RetryTemplate;

  • org.springframework.retry.RetryPolicy → org.springframework.core.retry.RetryPolicy;

  • org.springframework.retry.RecoveryCallback → org.springframework.integration.core.RecoveryCallback。Spring Framework には RecoveryCallback の抽象化は存在せず、RetryException 上の通常の try..catch で十分です。Spring Integration では、RecoveryCallback はエラーチャネルへのデッドレターパブリッシャーとして機能します。

  • org.springframework.retry.backoff.BackOffPolicy → org.springframework.util.backoff.BackOff。ただし、これは RetryTemplate オプションとして直接公開されるのではなく、RetryPolicy.Builder 経由の設定によってサポートされる内部 API として公開されます。

  • AMPQ、JMS、Apache Kafka チャネルアダプターの RetryContext は、内部 AttributeAccessor 実装に置き換えられます。

次のプロジェクトクラスに重大な変更が発生しました。

  • AmqpBaseInboundChannelAdapterSpec

  • AmqpBaseInboundGatewaySpec

  • AmqpInboundChannelAdapter

  • AmqpInboundGateway

  • PostgresSubscribableChannel

  • ChannelPublishingJmsMessageListener

  • JmsInboundGatewaySpec

  • JmsMessageDrivenChannelAdapterSpec

  • KafkaInboundGatewaySpec

  • KafkaMessageDrivenChannelAdapterSpec

  • KafkaInboundEndpoint

  • KafkaInboundGateway

  • KafkaMessageDrivenChannelAdapter

RequestHandlerRetryAdvice は、外部 API を可能な限り回避するように再構築されました。ステートレスなリトライロジックについては、org.springframework.core.retry.RetryPolicy を提供するだけで十分です。ステートフルなリトライロジックは Function<Message<?>, Object> stateKeyFunction によって起動されます。RetryStateGenerator 抽象化とその SpelExpressionRetryStateGenerator 実装は、spring-retry API への依存のため削除されました。

<int:handler-retry-advice> XML コンポーネントの max-attempts 属性は、失敗したハンドラーの呼び出し試行回数に関するこのプロパティのロジックをより適切に反映するために、max-retries に名前が変更されました。

詳細については、再試行のアドバイスを参照してください。

すべてのモジュールが標準パッケージ構造に従うようになりました。受信および送信コンポーネントは、それぞれ inbound パッケージと outbound パッケージで宣言されています。MessageChannel の実装は channel パッケージで宣言されています。ほとんどのモジュールは最初からこのルールに従っています。このバージョンでのパッケージ構造のリファクタリングには、残りのモジュール(spring-integration-filespring-integration-ftpspring-integration-ipspring-integration-jdbcspring-integration-jmsspring-integration-jmxspring-integration-mailspring-integration-sftpspring-integration-streamspring-integration-ws)も含まれます。ルートパッケージにあったクラスは、非推奨としてマークされています。

新規コンポーネント

新しい DistributedLock インターフェースが導入され、カスタム TTL (Time-to-Live) でロックを取得するための新しいメソッド lock(Duration ttl と tryLock(long time, TimeUnit unit, Duration ttl) が提供されます。詳細については、分散ロックを参照してください。

Jackson 2 サポートは非推奨となり、削除されました。Jackson 3 は新しいコンポーネント JacksonJsonObjectMapperJacksonPropertyAccessorJacksonIndexAccessorJacksonMessagingUtils でデフォルトになりました。詳細については、それぞれの Javadoc を参照してください。また、移行パスについては、非推奨となりたクラスを参照してください。

spring-integration-amqp モジュールは、RabbitMQ AMQP 1.0 サポート用のチャネルアダプターを実装しました。詳細については、AMQP 1.0 サポートの章を参照してください。

JDBC の変更

JDBC モジュールは、専用の org.springframework.integration.jdbc.dsl.Jdbc ファクトリを介して Java DSL API を提供するようになりました。詳細については、JDBC コンポーネント用の Java DSL の章を参照してください。

JdbcLock は、ロックステータスデータの TTL(Time to Live)をカスタマイズする機能をサポートするようになりました。詳細については、JDBC ロックレジストリを参照してください。

メッセージストアでは、直列化されたメッセージの内容が必ずしもバイト配列として保存されるとは限らないため、MESSAGE_BYTES ではなく MESSAGE_CONTENT という列名を使用するようになりました。また、すべての標準 SQL スキーマも変更され、INT_MESSAGE および INT_CHANNEL_MESSAGE テーブルのそれぞれの列には MESSAGE_CONTENT という列名が使用されるようになりました。詳細については、JDBC メッセージストアを参照してください。

JdbcChannelMessageStore は、Java シリアライゼーションの代替として JSON シリアライゼーションをサポートするようになりました。新しいコンポーネント JsonChannelMessageStorePreparedStatementSetter と JsonMessageRowMapper を使用すると、JSON 形式でメッセージを保存できます。これには、バイナリ型ではなくテキストベースの列型(JSONBJSONTEXT や CLOB など)を使用するようにデータベーススキーマを変更する必要があります。詳細については、JDBC チャネルメッセージストア JSON 直列化を参照してください。

Redis の変更

RedisLock は、ロックステータスデータの TTL(Time to Live)をカスタマイズする機能をサポートするようになりました。詳細については、Redis ロックレジストリを参照してください。

Hazelcast の変更

spring-integation-hazelcast モジュール内の以前は非推奨だったクラス ( LeaderInitiatorHazelcastMembershipListenerHazelcastLocalInstanceRegistrarHazelcastLockRegistry など) は、オープンソースの Hazelcast ライブラリで CP サブシステムがサポートされていないため、削除されました。

MQTT の変更

AbstractMqttMessageDrivenChannelAdapter および ClientManager 実装に quiescentTimeout オプションが追加されました。このオプションは、stop() メソッドを通じて MQTT Paho クライアントの disconnectForcibly() API に伝播されます。詳細については、MQTT サポートを参照してください。

ファイルの変更

FileReadingMessageSource の directory プロパティに SpEL Expression を設定できるようになりました。詳しくはファイルを読むを参照してください。

リモートファイルのサポートの変更

AbstractInboundFileSynchronizer は、maxFetchSize によるスライス後の Session.list(remoteDirectory) のフィルタリング結果をキャッシュするようになりました。そのため、以降の同期では、キャッシュが枯渇するまで、maxFetchSize によってキャッシュされた結果のみが処理されます。詳細については、受信チャネルアダプター: リモートファイルフェッチの制御を参照してください。

すべての AbstractPersistentAcceptOnceFileListFilter 実装で、メタデータエントリキーに「長いファイル名」を使用するようになりました。以前は、ファイル名のみを使用すると、同じファイル名を持つ異なるディレクトリに同じフィルターを適用した場合に、メタデータの上書き問題が発生する可能性がありました。たとえば、RotatingServerAdvice はタイムスタンプに基づいてディレクトリを切り替えますが、ビジネスロジックに従ってファイルは同じ名前でそこに配置されます。詳細については、リモート永続ファイルリストフィルターを参照してください。

null 安全

JSpecify と NullAway を使用するようにコードベースを更新し、@NullMarked アノテーションを使用してパッケージレベルですべての型をデフォルトで非 null に設定し、@Nullable アノテーションを使用して null になり得る型を明示的にマークする包括的な null 安全性実装を追加しました。詳細については、null 安全を参照してください。

SMB サポートの変更

SMB サポートモジュールの基盤となる JCIFS ライブラリが 3.0.0 にアップグレードされました。これはコードベースの大幅な書き換えであり、新しいパッケージ構造を実装しています。これは互換性を破る変更であり、JCIFS ライブラリのコンポーネントへの直接参照を更新する必要があります。詳細は SMB サポートを参照してください。