BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース リアクティブデータベースアクセスを主とした次世代Spring Dataの最初のマイルストーンをPivotalはリリースした

リアクティブデータベースアクセスを主とした次世代Spring Dataの最初のマイルストーンをPivotalはリリースした

原文(投稿日:2017/01/19)へのリンク

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で公開されている。

リソース

リアクティブプログラミングの詳細については、以下の記事を参照して欲しい。

 
 

Rate this Article

Relevance
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT