datamill是一个基于RxJava开发函数响应式风格的Java Web框架,可看成是SpringBoot竞争的框架,使用Java8和lambda,它不同于其他Java框架,使得通过整个应用的数据流和行为变为高度可见的,这样你不需要使用魔术效果元注释,使得很多效果隐藏在复杂的框架和文档后面,相反,你只要显式明确指定数据是如何在你的应用中流动,如何修改这些数据即可。只需要使用简单的RxJava风格即可。

当你使用Spring框架时,虽然只需要很少代码就可以跑起来,但是当项目复杂以后,你会发现很多功能和行为被使用元注解隐藏在了框架和文档后面,变得难以捉摸和不确定性。但是你如果不想使用元注释,你会遇到阻碍,你需要调试数百行框架自身的代码以找出背后的原理机制,以及如何搞定框架以让它做你想做的事情。

看看datamill的简单代码:

public static void main(String[] args) {

OutlineBuilder outlineBuilder = new OutlineBuilder();

Server server = new Server(

rb -> rb.ifMethodAndUriMatch(Method.GET, "/status", r -> r.respond(b -> b.ok()))

.elseIfMatchesBeanMethod(outlineBuilder.wrap(new TokenController()))

.elseIfMatchesBeanMethod(outlineBuilder.wrap(new UserController()))

.orElse(r -> r.respond(b -> b.notFound())),

(request, throwable) -> handleException(throwable));

server.listen(8081);

}

datamill应用总是以标准的Java应用开始,可以明确地创建HTTP服务器,指定请求如何被处理,以及服务器监听端口,不像传统的JEE部署,你得配置servlet容器或应用服务器的配置,你只要启动这段服务器代码你就控制了一切,这也使得为这个服务器创建Docker容器变得很简单,只要使用Maven打包一个可执行的JAR包即可,放入标准的Java Dcoker容器即可。

当Http到达你的服务器,它是如何流过你的应用变得显著可见:

rb.ifMethodAndUriMatch(Method.GET, "/status", r -> r.respond(b -> b.ok()))

这一行代码说服务器首先检查请求应该是一个从URI为/status的GET请求,如果是,返回HTTP是ok的响应。

下面两行显示你能组织你的请求处理器,同时能够保持对请求之后如何处理也就是发生了什么情况保持可读性和可维护性。

.elseIfMatchesBeanMethod(outlineBuilder.wrap(new UserController()))

这段代码是说看看请求是否匹配UserController实例的一个处理方法,为了理解这个匹配工作原理,我们看看UserController的类,下面是处理请求的方法代码:

@Path("/users")

public class UserController {

...

@GET

@Path("/{userName}")

public Observable getUser(ServerRequest request) {

return userRepository.getByUserName(request.uriParameter("userName").asString())

.map(u -> new JsonObject()

.put(userOutlineCamelCased.member(m -> m.getId()), u.getId())

.put(userOutlineCamelCased.member(m -> m.getEmail()), u.getEmail())

.put(userOutlineCamelCased.member(m -> m.getUserName()), u.getUserName()))

.flatMap(json -> request.respond(b -> b.ok(json.asString())))

.switchIfEmpty(request.respond(b -> b.notFound()));

}

...

}

你能看到我们使用@Path和@Get元注释标记为请求处理器方法。这里你就不需要像Spring框架需要挖掘框架数百行代码以搞清楚框架是如何路由你的请求到你的代码。

最后,请注意在UserController中响应是如何被创建的,是如何显式进行JSON组合的:

.map(u -> new JsonObject()

.put(userOutlineCamelCased.member(m -> m.getId()), u.getId())

.put(userOutlineCamelCased.member(m -> m.getEmail()), u.getEmail())

.put(userOutlineCamelCased.member(m -> m.getUserName()), u.getUserName()))

.flatMap(json -> request.respond(b -> b.ok(json.asString())))

你能充分控制JSON到内部细节,也不需要使用Jackson进行JSON自定义,或者使用Spring Data REST试图定制自己的响应,这些烦恼和复杂都没有了。

下面再看看你一个仓储查询代码:

public class UserRepository extends Repository {

...

public Observable getByUserName(String userName) {

return executeQuery(

(client, outline) ->

client.selectAllIn(outline)

.from(outline)

.where().eq(outline.member(m -> m.getUserName()), userName)

.execute()

.map(r -> outline.wrap(new User())

.set(m -> m.getId(), r.column(outline.member(m -> m.getId())))

.set(m -> m.getUserName(), r.column(outline.member(m -> m.getUserName())))

.set(m -> m.getEmail(), r.column(outline.member(m -> m.getEmail())))

.set(m -> m.getPassword(), r.column(outline.member(m -> m.getPassword())))

.unwrap()));

}

...

}

注意,这里精确SQL查询可自由组合,对于那些使用元注释产生查询语句的人来说,你会再次体会到清晰。

在一个简单应用中,查询中有很小比例需要超过JPA实现以外进行定制,几乎所有应用都有这种情况,这时你开始钻研框架内部代码时会变得非常消沉。

请注意这里数据是如何从查询结果中取出来放入实体的,最后注意代码还能保持怎样的精确,这些都是使用lambda和RxJava可观察操作的原因。

java reactive web,基于RxJava的函数式Reactive Web框架:datamill相关推荐

  1. java nio2 iocp_基于JDK7 NIO2的高性能web服务器实践之二(转)

    前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个Acc ...

  2. Java Web——基于Servlet、JSP(无框架版)电影网站项目总结 (二,完结版)

    今天来谈谈项目的"基石"--数据库,在这个项目中,我设计了7张表,如下图所示: allmovies:存放所有电影的相关信息 clicknumber:记录每一部电影的被点击次数, c ...

  3. Reactive Programming with RxJava,介绍一本书和Rx

    Reactive Programming with RxJava,介绍一本书和Rx 标签(空格分隔): book RxJava Who Should Read This Book Reactive P ...

  4. java osgi web开发_基于 OSGi 和 Spring 开发 Web 应用

    开发一个简单的OSGi Web应用实例 一个简单的Web应用 我们写一个简单的 Web 应用 compute.html :计算两个数字的和或乘积.如下图所示: 图1.一个简单例子 一个简单例子.bmp ...

  5. java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部 ...

  6. java计算机毕业设计基于web旅游网站的设计与实现源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计基于web旅游网站的设计与实现源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计基于web旅游网站的设计与实现源程序+mysql+系统+lw文档+远程调试 本源 ...

  7. java计算机毕业设计基于web的民宿预定系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计基于web的民宿预定系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计基于web的民宿预定系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: ...

  8. java温度计刻度,[Java教程]树莓派 基于Web的温度计

    [Java教程]树莓派 基于Web的温度计 0 2017-01-05 00:00:11 前言:家里的树莓派吃灰很久,于是拿出来做个室内温度展示也不错. 板子是model b型. 使用Python开发, ...

  9. Java毕设项目基于Web生鲜O2O订购平台的设计与实现(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目基于Web生鲜O2O订购平台的设计与实现(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + H ...

  10. Java高阶编程——RxBus 开源,基于 RxJava 的 event bus

    介绍 RxBus 是一个发布/订阅模式的事件总线,用法和 EventBus 一样简单.RxBus 基于 RxJava 开发,除了拥有和 EventBus 一样简单的事件总线机制之外,还拥有 RxJav ...

最新文章

  1. 简单介绍python连接telnet和ssh的两种方式
  2. coursera—吴恩达Machine Learning笔记(1-3周)
  3. python科学计算基础教程pdf下载-用Python做科学计算 高清晰PDF
  4. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
  5. 160 - 36 cupofcoffe.2
  6. IntelliJ IDEA最常用的一些快捷键,学会了室友还以为你在祖安对线
  7. (二叉树存储+递归遍历)Binary Tree Traversals
  8. linux系统chmod缩写,文件属性控制命令chmod
  9. android版 点击下载,自动点击器最新版
  10. Python3 hex() 函数
  11. VB:谁终结了我的程序
  12. 惊!史上最佳GAN现身,超真实AI假照片,行家们都沸腾了
  13. c++ const
  14. uniapp调用c语言方法,uni-app 入坑指南-web开发
  15. C语言之内存分配函数
  16. 世界第一个聊天机器人源代码_这是世界上第一个“活着”的机器人
  17. 写个单机版斗地主程序,复习c++面向对象
  18. vim yank 命令
  19. java 递归算法N的乘阶
  20. 嵌入式软件测试——1.简介

热门文章

  1. HDU 6098 Inversion 思维
  2. 干货~powershell与bash和docker在项目中怎么用
  3. ubuntu下弹框提醒
  4. WebService 分布式事务怎么控制
  5. 2010年篮球规则(FIBA)
  6. VC通用控件自适应屏幕类
  7. 深入浅出Linux设备驱动编程--引言
  8. java连接hive类找不着_JDBC 连接 hive2 遇到的java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver...
  9. python 窗体k线图_在GUI窗口中绘制一个茅台股票K线图
  10. 软件测试时间特性,软件测试-第九章调试特性