ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浅谈 Next 开发

2022-01-14 12:01:57  阅读:222  来源: 互联网

标签:map Vert handler await Next 开发 fun 浅谈


  Cloudopt Next 是一个非常轻量级且现代的、基于 Kotlin 编写的全栈开发框架,同时支持 Java 和 Kotlin,可以处理 Url 的解析,数据的封装,Json 的输出等等,从根本上减少开发时间、提升开发体验。

  同时 Next 也是 Vert.x 及 awesome-kotlin 推荐项目。让我们来看看 Next 一些有趣的特点。

  比如直接用 Vert.x 写路由的话是下面这样的写法:

  router.route().handler(ctx -> {

  // This handler will be called for every request

  HttpServerResponse response = ctx.response();

  response.putHeader("content-type", "text/plain");

  // Write to the response and end it

  response.end("Hello World from Vert.x-Web!");

  });

  那么当你还要操作数据库的话,那么看起来就是一个回调嵌着一个回调,很容易形成回调地狱。

  让我们看看在 Next 中如何实现一个简单的输出 Json 的路由:

  @GET("json")

  fun json() {

  var map = hashMapOf<String, Any>()

  map.put("a", 1)

  map.put("b", 2)

  renderJson(map)

  }

  在写法上完全不需要改变自己的习惯用传统的写法即可。甚至你还可以直接使用类似 spring boot 的参数注入的写法(结合 hibernate 的参数校验):

  fun argsController(

  @Chinese(false)

  @Parameter("name", defaultValue = "Peter")

  name: String,

  @Min(18)

  @Parameter()

  age: Int ) {

  var map = hashMapOf<String, Any>()

  map["name"] = name

  map["age"] = age

  renderJson(map)

  }

  而且在 Cloudopt Next 中支持多种异步写法,你可以选择自己喜欢写法自由发挥:

  比如我们现在需要运行某个阻塞的代码并需要将结果传递回来,你可以用以下的方式运行。当然你也可以通过 Worker.worker 运行阻塞的代码。记得在结尾通过 handler.complete 传递结果。

  fun test() {

  var id = worker<Int>({ handler ->

  handler.complete(1)

  }, { asyncResult ->

  //onComplete

  })

  }

  第二种做法是利用 kotlin 的协程的 await 特性,写起来会更为优雅。但利用 kotlin 协程需要在方法上声明 suspend。这也是我们推荐的异步写法。

  suspend fun test() {

  var id = await<Int> { handler ->

  handler.complete(1)

  }

  }

  第三种情况是你在无法支持 suspend 语法的地方使用 await 语法。你可以使用下面的方式运行:

  fun test() {

  global {

  var id = await<Int> { handler ->

  handler.complete(1)

  }

  }

  }

  第四种做法是你可以在路由的方法上增加 @Blocking 注解,使其自动变为普通的路由。

  @Blocking

  @GET("blocking")

  fun blocking() {

  renderText("This is Blocking!")

  }

  比如我们利用 await 语法就可以直接使用任意的同步操作数据库 orm ,完全不用担心阻塞的问题(这里用的是 jooq):

  @GET

  suspend fun get() {

  await { promise ->

  val result = JooqManager.dsl?.selectFrom(Tables.TODO)?.fetch()?.into(Todo::class.java)

  renderJson(result )

  promise.complete()

  }

  }

  当然你把它封装好的话,看起来就是这样的:

  @GET

  suspend fun get() {

  renderJson(todoService.getTodoList())

  }

  当然还支持通过注解来设置验证器、Handler 等等,甚至还简化了 Vert.x 的 EventBus,你只需要在路由上面声明 @AfterEvent即可自动完成在 xxx 事件后执行 xxx 事件这种方式。

  @GET("afterEvent")

  @AfterEvent(["net.cloudopt.web.test"])

  fun afterEvent() {

  this.context.data().put("key","value")

  renderText("AfterEvent is success!")

  }

  你只需要在其它类上声明 @AutoEvent 并继承 EventListener 即可自动订阅这个事件。

  @AutoEvent("net.cloudopt.web.test")

  class TestEventListener:EventListener {

  override fun listener(message: Message<Any>) {

  print(message.body())

  }

  }

  Cloudopt Next 在很大程度上让你保留了原先的编程习惯,同时获得了 Vert.x 的强大的性能。不仅如此,Cloudopt Next 提供了大量的插件,如分布式二级缓存、jooq、redis、日志、spring支持、quartz、国际化等等 Vert.x 没有提供的功能。还兼容 Vert.x 的模块体系。也就是说你不仅可以用 Next 官方出的插件,还可以用 Vert.x 的插件以及 Vert.x 社区贡献的一系列生态。

  赶紧试试吧,使用 Koltin + Next 你将获得一个学习曲线平滑、使用简单、符合直觉且性能极高的异步服务!!!

标签:map,Vert,handler,await,Next,开发,fun,浅谈
来源: https://www.cnblogs.com/qungyujie/p/15801306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有