Java 目前实现全异步的方式有哪些

2021-07-25 10:20:35 +08:00
 ljzxloaf

除了 callback

7940 次点击
所在节点    Java
48 条回复
ljzxloaf
2021-07-26 06:46:06 +08:00
不能 append 了。。

简单总结下:看起来这几种异步实践流行度差不多,所以如果没有 reactive 经验的直接上 vertx+kt coroutine ;有 reactive 经验:如果当前还是 servlet,直接上 webflux ;如果已经是异步 server,可以上 webflux 也可以上 rxjava ;懒得折腾的继续用 future/callback 吧,等 java 发布 coroutine 。

当然还有个不错的选择:转 golang 吧😈
ljzxloaf
2021-07-26 06:49:41 +08:00
@ljzxloaf #41 异步 server 应该上不了 webflux 了,webflux 包括了 server
BBCCBB
2021-07-26 08:45:54 +08:00
@wqhui sql 有 r2dbc 规范, 很多数据库都支持貌似.
p1gd0g
2021-07-26 09:44:44 +08:00
我发现 v2 黑夜模式看不到投票的选项。
DonaldY
2021-07-26 15:53:27 +08:00
全异步就得解决数据库连接的问题。例如 JDBC,阻塞转换为非阻塞才行。

否则,都相差不多。
cloudopt
2021-07-26 17:04:46 +08:00
试试看 Cloudopt Next 吧:

https://github.com/cloudoptlab/cloudopt-next

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

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


** Cloudopt Next 主要拥有以下特点:**


> **简单** 极简设计,几乎不要任何配置,不依赖 Tomcat 、Jetty 等 Web 容器。



> **异步** 基于 vertx 轻松实现高性能的异步服务。



> **扩展** 支持 vertx 体系的各种组件,同时支持通过插件扩展功能,官方也提供了大量好用的插件。



> **中文** 全中文文档、中文社区,帮助中文开发者快速上手。



**GitHub:**


https://github.com/cloudoptlab/cloudopt-next


**开源中国:**

https://gitee.com/cloudopt/cloudopt-next


## 示例


您可以通过访问[Cloudopt Next 的官网]( https://next.cloudopt.net)来查看文档,也可以前往[Example]( https://github.com/cloudoptlab/cloudopt-next-example)查看简单的示例。


### 路由


让我们来看看一个简单的基于 Cloudopt Next 的路由:


```kotlin
@API("/")
class IndexController : Resource() {
@GET
fun get(){
renderHtml(view = "index")
}
}
```


```java
@API(value = "/")
public class IndexController extends Resource {

@GET
public void get(){
View v = new View();
v.setView("index");
renderHtml(v);
}
}
```


### 启动


```kotlin
fun main(args: Array<String>) {
NextServer.run()
}
```


```java
public static void main(String args[]) {
NextServer.run();
}
```


### 超好用的协程
```kotlin
var value = await<String>{handler->
handler.complete(RedisManager.sync().get("key"))
}
```
###
### WebSocket
```kotlin
@WebSocket("/websocket")
class WebSocketHandler : WebSocketResource {

override suspend fun onConnectionSuccess(websocket: ServerWebSocket) {
websocket.writeTextMessage("Connection successful!") {
println("The event of after write.")
}

val buffer: Buffer = Buffer.buffer().appendInt(123).appendFloat(1.23f)

websocket.writeBinaryMessage(buffer) {
println("The event of after write binary.")
}
}

override suspend fun onConnectionFailure(throwable: Throwable) {

}

override suspend fun onConnectionComplete(websocket: ServerWebSocket) {

}

override suspend fun onFrameMessage(frame: WebSocketFrame, websocket: ServerWebSocket) {

}

override suspend fun onTextMessage(message: String, websocket: ServerWebSocket) {
println(message)
websocket.writeTextMessage("This is the message from the server!")
}

override suspend fun onBinaryMessage(buffer: Buffer, websocket: ServerWebSocket) {

}

override suspend fun onPong(buffer: Buffer, websocket: ServerWebSocket) {

}

override suspend fun onException(throwable: Throwable, websocket: ServerWebSocket) {
throwable.printStackTrace()
if (!websocket.isClosed) {
websocket.close()
}
}

override suspend fun onDrain(websocket: ServerWebSocket) {

}

override suspend fun onEnd(websocket: ServerWebSocket) {
println("Connection was closed.")
}
}
```
### SockJS


```kotlin
@SocketJS("/socket/api/*")
class SocketController : SocketJSResource {
override fun handler(userSocketConnection: SockJSSocket) {
println(userSocketConnection)
userSocketConnection.handler {message->
println(message)
userSocketConnection.write("Hello world!")
}
}
}
```


### 插件


```kotlin
fun main(args: Array<String>) {
NextServer.addPlugin(TestPlugin())
NextServer.addPlugin(EventPlugin())
NextServer.run()
}
```
cloudopt
2021-07-26 17:06:05 +08:00
尴尬了,回复不支持 markdown,大家可以去 GitHub 看看。
chocotan
2021-07-27 09:28:02 +08:00
我们的 api 网关是异步 servlet
部分模块也有用 rxjava

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/791594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX