Firefly 4.5.0 正式版发布,Java 异步 Web 框架

栏目: 软件资讯 · 发布时间: 7年前

内容简介:Firefly 4.5.0增加了Kotlin DSL风格的API和Spring Reactor适配器来帮助我们更方便的构建异步应用程序。 Kotlin DSL风格的API允许我们以半声明的方式来构造应用,例如: private val log = Log.getLogger { ...

Firefly 4.5.0增加了Kotlin DSL风格的API和Spring Reactor适配器来帮助我们更方便的构建异步应用程序。

Kotlin DSL风格的API允许我们以半声明的方式来构造应用,例如:

private val log = Log.getLogger { }

fun main(args: Array<String>) {
    val server = HttpServer(requestLocal) {
        router {
            httpMethod = HttpMethod.GET
            path = "/"

            asyncHandler {
                end("hello world!")
            }
        }

        router {
            httpMethods = listOf(GET, POST)
            path = "/product/:type/:id"

            asyncHandler {
                statusLine {
                    status = OK.code
                    reason = OK.message
                }

                header {
                    "My-Header" to "Ohh nice"
                    SERVER to "Firefly kotlin DSL server"
                    +HttpField("Add-My-Header", "test add")
                }

                trailer {
                    "You-are-trailer" to "Crane ....."
                }

                val type = getRouterParameter("type")
                val id = getRouterParameter("id")
                log.info { "req type: $type, id: $id" }

                writeJson(Response("ok", 200, Product(id, type))).end()
            }
        }
    }
    server.listen("localhost", 8080)
}

在这个例子中,我们使用Kotlin DSL风格的API来设置HTTP method, path, header等,它能更清晰的表达HTTP协议的结构。

Firefly HTTP Server/Client (Kotlin版本)在协程(Coroutine)中执行业务逻辑,这意味着我们可以以同步风格的代码编写异步应用程序。编写协程同步风格的代码相比异步回调更简单,更易于阅读,并且不会影响程序的性能和伸缩性。

由于 Java 语言并没有原生协程(Coroutine),在未来的版本中我们考虑增加Quasar(一个JVM第三方协程库)适配器来使得Java版本的HTTP Server/Client运行在协程中。

为了让Java版本的框架更容易编写异步应用程序,增加了Spring Reactor适配器来帮助我们更流畅的构建异步应用。例如:

@Override
public Mono<Boolean> buy(ProductBuyRequest request) {
    if (request == null) {
        return Mono.error(new IllegalArgumentException("The product request is required"));
    }

    if (request.getUserId() == null || request.getUserId().equals(0L)) {
        return Mono.error(new IllegalArgumentException("The user id is required"));
    }

    if (CollectionUtils.isEmpty(request.getProducts())) {
        return Mono.error(new IllegalArgumentException("The products must bu not empty"));
    }

    return db.newTransaction(c -> buy(request, c));
}

private Mono<Boolean> buy(ProductBuyRequest request, ReactiveSQLConnection c) {
    return inventoryDAO.updateBatch(request.getProducts(), InventoryOperator.SUB, c)
                       .doOnSuccess(this::verifyInventory)
                       .flatMap(arr -> productDAO.list(toProductIdList(request), c))
                       .map(products -> toOrders(request, products))
                       .flatMap(orders -> orderDAO.insertBatch(orders, c))
                       .map(orderIdList -> true);
}

更多的例子请参考:

更新日志:

  1. 增加Kotlin DSL风格的API

  2. 增加异步 SQL 客户端

  3. 增加Reactive stream适配器

  4. 增加Coroutine dispatcher

  5. HTTP客户端增自动识别gzip编码

  6. 增加slf4j MDC实现

  7. 增加日志formatter

  8. 增加AffinityThreadPool


【声明】文章转载自:开源中国社区 [http://www.oschina.net]


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

.NET框架程序设计

.NET框架程序设计

(美)Jeffrey Richter、(美)Francesco Balena / 李建忠 / 华中科技大学出版社 / 2004-1 / 54.00元

Microsoft.NET框架为简化开发与卫联网无缝连接的应用程序和组件提供了强大的技术支持,如ASP.NET Web窗体、XML Web服务以及Windows窗体。本书的目的在于展示.NET框架中公共语言运行库存的核心内容。全书由两位广受尊敬的开发者/作者完成,并假设读者理解面向对象程序设计的基本概念,如数据抽象、继承和多态。书中内容清楚地解释了CLR的扩展类型系统,CLR如何管理类型的行为,以......一起来看看 《.NET框架程序设计》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具