Pivotalは先日、Kayリリーストレインと名付けられた次世代Spring Dataプロジェクトの最初のマイルストーンをリリースした。リリースには次のように述べられている。
これは、Spring Dataの新しい世代を出荷するための特別なリリーストレインで、今後いくつかの破壊的な変更を含むでしょう。
重要な変更点は次のとおりだ。
- 以下のフルサポートを含んだインフラストラクチャアップグレード
- Java 8
- Spring 5
- 以下のリアクティブサポート
- JRedisとSRPドライバの廃止
MongoDB、Cassandra、Redisは、リアクティブデータアクセスのための利用可能なドライバとして選択された。Project ReactorおよびRxJavaのSpring Dataリポジトリインタフェースは、3つすべてに含まれている。
Spring DataによるリアクティブMongoDBアクセスの例を始めるために、次のPOJOを考える。
public class Person {
private @Id String id;
private final String firstname;
private final String lastname;
}
Project Reactorを使用した基本となるリアクティブリポジトリインタフェースは次のように書ける。
public interface ReactivePersonRepository extends ReactiveCrudRepository<Person,String> {
Flux<Person> findByLastname(String lastname);
@Query("{ 'firstname': ?0, 'lastname': ?1}")
Mono<Person> findByFirstnameAndLastname(String firstname,String lastname);
Flux<Person> findByLastname(Mono<String> lastname);
}
リアクティブクラスであるFlux<T>
とMono<T>
は、戻り値の型およびパラメータとして使用できるようになった。
最近のInfoQ記事では次のように定義されている。
FluxはRxJavaの
Observable
と同等のもので、0以上の要素を出力し、任意に完了またはエラーのいずれかを行うことができます。
一方、Monoは最大で1回だけ発行することができます。これはRxJava側の
Single
型とMaybe
型の両方に対応しています。したがって、完了を通知するだけの非同期タスクはMono<Void>
を使用できます。
同様に、RxJavaを使用した基本となるリアクティブリポジトリインタフェースは次のように書ける。
public interface RxJava1PersonRepository extends RxJava1CrudRepository<Person,String> {
Observable<Person> findByLastname(String lastname);
@Query("{ 'firstname': ?0, 'lastname': ?1}")
Single<Person> findByFirstnameAndLastname(String firstname,String lastname);
Observable<Person> findByLastname(Single<String> lastname);
}
Spring Dataリアクティブリポジトリの有効化は、以下のMongoDBの例に示すように、@EnableReactiveMongoRepositories
アノテーションや@EnableCassandraRepositories
アノテーションによって行われる。
@EnableReactiveMongoRepositories
@AutoConfigreAfter(EmbeddedMongoAutoConfiguration.class)
class ApplicationConfiguration extended AbstractReactiveMongoConfiguration {
@Bean
public LoggingEventListener mongoEventListener() {
return new LoggingEventListener();
}
@Override
@Bean
public MongoClient mongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}
データベース操作用の従来のテンプレートを構築するのと同様に、リアクティブテンプレートを次のように書ける。
public interface ReactiveMongoOperations {
// other operations...
<T> Mono<T> findOne(Query query,Class<T> entityClass);
<T> Flux<T> find(Query query,Class<T> entityClass);
<T> Mono<T> insert(T objectToSave,String collectionName);
<T> Mono<T> insert(Mono<? extends T> objectToSave);
}
データはテンプレートを介して挿入することもできる。
Flux<Person> flux = Flux.just(new Person("Vincent","Vega"),
new Person("Jules","Winnfield"),
new Person("Marsellus","Wallace"),
new Person("Mia","Wallace"));
template.insertAll(flux).subscribe();
Spring DataによるリアクティブMongoDBアクセスのプロジェクト全体はGitHubで公開されている。
リソース
リアクティブプログラミングの詳細については、以下の記事を参照して欲しい。
- Victor GraziによるRxJava by Example
- Simon BasléによるReactor by Example
- Pivotalのブログ記事 Going Reactive with Spring Data
- GitHubにあるすべてのSpring Dataコード例
Rate this Article
- Editor Review
- Chief Editor Action