下面的类是我的工人顶点,我想在其中执行一个阻塞代码,从事件总线上的一个名为事件配置的通道接收消息。
目标是无限期地生成和发布json消息,直到我在events config channel上收到停止操作消息。
我使用ExecuteBlock来实现所需的功能。但是,由于我无限期地运行阻塞操作,vertx阻塞了threadchecker转储警告。
问题:
-有没有一种方法可以仅对特定垂直方向禁用blockedthreadchecker
-下面的代码是否遵循在vertx中根据需要执行无限循环的最佳实践?如果没有,你能建议最好的方法吗?
public class WorkerVerticle extends AbstractVerticle {
Logger logger = LoggerFactory.getLogger(WorkerVerticle.class);
private MessageConsumer<Object> mConfigConsumer;
AtomicBoolean shouldPublish = new AtomicBoolean(true);
private JsonGenerator json = new JsonGenerator();
@Override
public void start() {
mConfigConsumer = vertx.eventBus().consumer("events-config", message -> {
String msgBody = (String) message.body();
if (msgBody.contains(PublishOperation.START_PUBLISH.getName()) && !mJsonGenerator.isPublishOnGoing()) {
logger.info("Message received to start producing data onto kafka " + msgBody);
vertx.<Void>executeBlocking(voidFutureHandler -> {
Integer numberOfMessagesToBePublished = 100000;
if (numberOfMessagesToBePublished <= 0) {
logger.info("Skipping message publish :"+numberOfMessagesToBePublished);
return; // is it best way to do it ??
}
publishData(numberOfMessagesToBePublished);
},false, voidAsyncResult -> logger.info("Blocking publish operation is terminated"));
} else if (msgBody.contains(PublishOperation.STOP_PUBLISH.getName()) && mJsonGenerator.isPublishOnGoing()) {
logger.info("Message received to terminate " + msgBody);
mJsonGenerator.terminatePublish();
}
});
}
private void publishData(){
while(shouldPublish.get()){
//code to generate json indefinitely until some one reset shouldPublish variable
}
}
}
您不想在异步代码中使用忙循环。
使用vertx。setPeriodic()
或vertx。改为setTimer()
:
vertx.setTimer(20, (l) -> {
// Generate your JSON
if (shouldPublish.get()) {
// Set timer again
}
});
我正在尝试构建一个worker verticle,通过采用kotlin的PubSub示例,结合这个关于worker无限阻塞循环处理的答案,将Google cloud PubSub主题订阅与vert.x的事件总线连接起来。 它确实有效,但Vert. X在收到来自PubSub的消息后的某个时间通过抛出异常来不断唠叨的日志(请暂时忽略阻止初始化): 这是源代码: 我显然错过了一些东西。此外,如果您有更好
OpenResty 的诞生,一直对外宣传是同步非阻塞(100% non-blocking)的。基于事件通知的 Nginx 给我们带来了足够强悍的高并发支持,但是也对我们的编码有特殊要求。这个特殊要求就是我们的代码,也必须是非阻塞的。如果你的服务端编程生涯一开始就是从异步框架开始的,恭喜你了。但如果你的编程生涯是从同步框架过来的,而且又是刚刚开始深入了解异步框架,那你就要小心了。 Nginx 为了减
问题内容: 我可以很轻松地在Node.js中编写非阻塞I / O。 这就是整个库的用途。 但是所做的任何计算都是阻塞的。任何通过事件发送器的消息都将被阻止。 例如,发出事件立即得到解决,因此被阻止: 除了将调用包装起来外,如何使代码无阻塞? 我希望在事件循环的每个周期中进行尽可能少的计算,以便可以同时为尽可能多的客户端提供服务。 如何以非阻塞方式编写代码? 当我拥有非阻塞代码时,如何在多个进程之间
我有一个顶点,它有一个处理程序,可以在事件循环线程中调用Vertx的Web客户端。实际的底层API调用是同步的还是异步的?它会阻塞我的事件循环线程吗?假设我的API调用需要30秒才能返回。 我是否需要用Vertx.execute阻塞(p-
这一节解释 BlockingObservable 的子类. 一个阻塞的Observable 继承普通的Observable类,增加了一些可用于阻塞Observable发射的数据的操作符。 要将普通的Observable 转换为 BlockingObservable,可以使用 Observable.toBlocking( )) 方法或者BlockingObservable.from( )) 方法。
我是Vert的新手。我正在尝试实现一个小型REST API,它将数据存储在本地文件系统的JSON文件中。 到目前为止,我设法实现了REST API,因为Vertx在这方面有很好的文档记录。 我目前正在寻找的是如何在Vert. x中构建数据访问对象的示例。我怎样才能实现一个可以对包含JSON的文本文件执行粗鲁操作的版本? 你能给我举些例子吗?有什么提示吗? 更新1: 通过对文件进行CRUD操作,我想