Vertx执行阻塞代码

本文介绍了Vert.x中三种Verticle类型的特性及其应用场景,包括StandardVerticles、WorkerVerticles和Multi-threadedworkerverticles,并详细探讨了如何在Vert.x中处理阻塞代码,提供了两种方法:使用worker pool直接执行和通过WorkerVerticles执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提知识

Verticle类型:
1. Standard Verticles:会被eventloop线程执行,Verticle内的异步回调Handler也会被同一个eventloop线程来执行,所以同一个Verticle的所有的异步回调Handler会被顺序执行
2. Worker Verticles:会被Worker 线程池中的任意一个线程执行,同时Verticle内的异步回调Handler也会被Worker 线程池中的任意一个线程执行,和Standard Verticles一样,同一个Verticle的所有的异步回调Handler也会被顺序执行,这是由vertx来保证的
3. Multi-threaded worker verticles:会被并发执行的Verticle,不做过多讨论

Vertx执行阻塞代码的方法:
1. 通过worker pool来直接执行:
a,同一个Verticle调用此方法,所有阻塞代码块会被顺序执行,对于操作redis或者db的时候,可以省去事务的事务。
b,阻塞代码块内的回调handler会被注册到Verticle的线程上,而不是worker pool的线程。所以如果是Standard Verticle,阻塞代码块会被worker pool的线程执行,但是阻塞代码块内的回调handler会被Standard Verticle的eventloop线程来执行,有可能造成eventloop阻塞。
c, 所以说用这种写法的话,阻塞代码块内应该都是同步处理,不应该再有异步处理。

WorkerExecutor executor = vertx.createSharedWorkerExecutor("my-worker-pool");
executor.executeBlocking(future -> {
  // Call some blocking API that takes a significant amount of time to return
  String result = someAPI.blockingMethod("hello");
  future.complete(result);
}, res -> {
  System.out.println("The result is: " + res.result());
});

如果想要并发执行,可以加上false参数

executor.executeBlocking(future->{

}, false, res->{

});

2.通过Worker Verticles来执行:多次调用deploy Worker Verticle的话,是并发执行的

DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

一般流程

业务流程通过Standard Verticles来实现,业务流程内的具体处理逻辑交由阻塞代码块执行。
比如说eventbus 消息处理系统:
eventbus 消息处理系统

需要注意:
1. 如果executor.executeBlocking用Worker Verticles来替代的话
a,需要考虑并发事务问题
b,deploy和undeploy Worker Verticle需要处理,额外浪费cpu处理

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值