BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Pivotal发布包含反应式数据访问特性的新一代Spring Data的第一个里程碑版本

| 作者 Michael Redlich 关注 11 他的粉丝 ,译者 张卫滨 关注 13 他的粉丝 发布于 2017年1月25日. 估计阅读时间: 9 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

Pivotal最近发布了下一代Spring Data项目的第一个里程碑版本,他们将其称之为Release Train Kay。在发布文档中,这样写到:

这是一个特殊的释放版本,会带领我们驶往新一代的Spring Data,在前行的过程中也会包含几项破坏性的变更。

重要的变更包括:

  • 基础设施升级,完全支持:
    • Java 8
    • Spring 5
  • 对如下数据库提供了反应式(Reactive)支持:
  • 废弃了JRedis和SRP驱动

选择MongoDB、Cassandra和Redis的原因在于它们具有实现反应式数据访问的可用驱动。针对这三种数据库,都包含了面向Reactor项目RxJava的Spring Data repository接口。

为了准备Spring Data反应式访问MongoDB的样例,我们考虑如下的POJO:

    public class Person {
    private @Id String id;
    private final String firstname;
    private final String lastname;
    }

使用Reactor项目的基本反应式repository接口可以写成如下所示的样子:

    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,它可以触发零或多个事件,并根据实际情况结束处理或触发错误。

而Mono最多只触发一个事件,它对应于RxJava的SingleMaybe,所以可以将Mono<Void>用于在异步任务完成时发出通知。

类似的,使用RxJava的基础反应式repository接口可以写成如下所示的样子:

    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反应式repository是通过注解完成的,也就是@EnableReactiveMongoRepositories@EnableCassandraRepositories,下面展示了MongoDB的样例:

@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 {
    // 其他操作……
    <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上找到。

相关资源

关于反应式编程的更多详细信息可以通过如下的文章来获取:

查看英文原文Pivotal Releases First Milestone of Next-Generation Spring Data Featuring Reactive Database Access

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT