问题标签 [vertx-eventbus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1026 浏览

java - Vertx 事件总线拦截器阻塞请求调用

当收到来自客户端的呼叫并响应回客户端时,我正在尝试通过事件总线发送数据。

一切正常,直到我在事件总线上添加拦截器..

这是代码: -

另一个疑问是,当我从 IDE 停止应用程序时,不会调用 Stop 方法,但是如果我从另一个工作正常的 Verticle 取消部署该 Verticle。

0 投票
2 回答
1019 浏览

hazelcast - 在 Quarkus 中配置集群 Vertx Eventbus 的问题

我在用着:

  • Quarkus 1.6.1.Final
  • Vertx 3.9.1(由quarkus-vertx依赖提供,见下面的pom.xml)

而且我无法让clusered Eventbus工作。我已按照此处列出的说明进行操作:

https://vertx.io/docs/vertx-hazelcast/java/

我还在 Quarkus 中启用了集群:

这是我的 pom.xml:

我得到的错误如下:

正如您在我的 pom.xml 中看到的那样,我还添加了依赖 hazelcast-all:3.9 并从 vertx-hazelcast:3.9.2 中排除了 hazelcast 依赖,然后这个错误消失了,但又出现了另一个错误:

我做错了什么或忘记了什么,或者这只是 Quarkus 或 Vertx 中的一个错误?

提前谢谢任何帮助。

0 投票
1 回答
147 浏览

java - VertX 事件总线发布事件导致高 CPU

我们正在使用 API 中的 vertx.eventBus().publish() 方法进行 GET 、 POST 、 PATCH 、 PUT 调用。这种方法消费者只是将数据推送到缓存[我们正在使用 HazleCast 缓存]。所以这个消费者被所有的API调用[高度限制]

在 perf testing 下运行它时,这会导致 Vertx 出现线程延迟问题,我们注意到这一点,因为当时 CPU 也越来越高。这会发生几秒钟,然后一切都恢复正常状态,然后在一段时间后再次发生。

经过调查,这种方法[即vertx发布事件的消费者方法]显示为瓶颈,并在此间歇性峰值期间显示出最长的耗时方法。

阅读大量文档后,我发现如下。

在内部,Vert.x 让 Netty 安排另一个对消费者的调用,直到当前调用(以及在 Netty 事件循环中安排在它前面的任何其他方法)完成之前,它才会运行。

您能否就此提出建议,看起来 vertx.eventBus().publish 方法不应该用于在同一应用程序中使用它,这不是一个好方法。

0 投票
1 回答
114 浏览

java - 如何使 Vert.x EventBus.send 按顺序处理请求?

我是 vert.x 的新手,想知道是否有可能以某种方式配置 eventbus 以使其始终如一地工作?

我的意思是需要使用 vert.x 一个一个地发送请求

目前我得到了这段代码,它使用事件循环原理并等待所有处理程序完成,但我不需要这么快完成,想法是同时从大量请求中释放服务器。这里eb_send()使用默认EventBus.send()方法。换句话说,我想用阻塞执行所有请求,在请求之前等待答案。

0 投票
0 回答
476 浏览

kotlin - Vertx:Verticle 的多个实例中的多个消费者

在我的应用程序中,我有两个 verticles(标准一个而不是工人),其中一个,比如说VerticleA,产生一些消息,另一个,比如说VerticleB,消耗它们。在VerticleB我创建了几个消费者来使用这些消息。

当我仅使用单个VerticleBie实例部署应用程序时,DeploymentOptions.setInstances(1)一切正常。但是,当我将实例数设置为一个以上时,消费者会在处理少量初始消息后停止处理消息。

从日志中我可以看到每个消费者都消费了几条消息,然后停止消费。暂停和恢复日志也是成对的,即每次pause()调用都有一个resume()调用,因此asyncProcess()即使在出现错误的情况下也会调用回调。消费者也没有结束。

我在这里阅读了核心手册https://vertx.io/docs/vertx-core/java/但我没有看到任何可以解决此问题的内容。

0 投票
1 回答
181 浏览

amazon-dynamodb - DynamoDB 插入调用的 Vertx 超时

我正在将 DynamoDB 与 Vertx 一起使用,并且我的一个 Verticle 因错误而超时

等待 30000(ms) 回复后超时。地址

但是当我异步运行 DynamoDB 保存查询时,我没有遇到这个问题。有人可以建议将 DynamoDB 与 vert.x 一起使用的最佳实践吗?

0 投票
1 回答
450 浏览

java - 当从 EventBus @ConsumeEvent 调用 Quarkus Panache Repository 时,调用会静默失败

Quarkus 1.8.3.Final

直接调用访问 PanacheRepository 的方法按预期工作,但是当通过 EventBus 调用相同的方法时,调用到达该方法并执行每一行,直到它到达任何存储库调用,然后静默失败/退出而没有任何指示发生了什么。

根据日志,直接调用在 Quarkus 主线程中执行,事件总线调用在 vert.x-eventloop-thread-2 中执行。

还尝试了以下步骤的组合,结果相同:

  • 将 EventBus 的消费者端包装到 Mutiny Uni。
  • 让消费者退回了大学。
  • 使消费者明确阻塞=假(默认)。
  • 尝试io.vertx.core.eventbus.EventBusio.vertx.mutiny.core.eventbus.EventBus实现。
  • 将消费者置于相同的服务和不同的服务。
  • 在被调用方法上使用 @Transactional 注释。

以下是日志的 EventBus 部分的摘录:

更新已创建错误报告

0 投票
1 回答
278 浏览

vert.x - 昂贵的 Vertx Eventbus Json 处理

我有一个关于 Vertx Eventbus 以及如何正确使用它的问题。在 Vertx 中使用 EventBus 至少有两种选择:

  1. 我使用 Vertx 提供的 Eventbus 方法来调用驻留在另一个 Verticle 上的函数。这里的好处是我可以使用编解码器通过 Eventbus 传递参数。如果我只想在本地使用它,我可以传递参考。这里的缺点是我需要提供一个字符串来定义我想要调用的函数。从开发者的速度来看,这很糟糕,因为现在我必须在代码库中搜索字符串才能找到我调用的函数。

  2. 我使用 Vertx 服务代理。这非常方便,因为它在编译时为 Eventbus 生成代理。这使我作为开发人员可以跟踪我在 Verticles 中调用的函数,而我根本不需要处理 Eventbus API。但是它也有一些重要的缺点:现在启动时间需要更长的时间,并且服务代理正在将所有函数属性转换为 Json 和从 Json 转换。这可能对应用程序性能非常不利。

我的问题:使用 Eventbus 的最佳方式是什么?我是否遗漏了一些可以帮助我解决选项二缺点的东西?有没有我还没有看到的替代品?

谢谢

0 投票
1 回答
46 浏览

vert.x - 如何测试不等待对其消息的确认的verticle?

我想测试一个通过 EventBus 接收请求并通过 EventBus 发送结果的工人 Verticle。单个请求可能会导致 0,1,2,... 响应——在一般情况下,我们不知道会得到多少响应。

业务逻辑是,一旦处理完成,请求就会被确认,但是响应是以“即发即弃”的方式发送的——因此我们只知道响应已发送,不一定它们已经交付。

我正在为这个verticle写一个测试。

测试代码计划如下:

这里的问题是第 4 步——在一般情况下,我们不知道是否仍有一些响应在飞行中。

蛮力解决方案显然是等待一些合理的时间——通常几毫秒就足够了。然而。我更喜欢概念性的东西。

我想到的一个解决方案是:

  1. 发送一些我们确定会有单一响应的请求;
  2. 等到消费者收到相应的响应。这应该可行,但我不喜欢我通过 SUT 发送两条消息而不是一条消息这一事实。

一个不同的解决方案是从测试代码发送一个额外的响应,一旦我们确认请求已被处理 - 但它会被认为是同一个发件人吗?EventBus 只保证来自同一个发件人的交付顺序,而不是来自不同的发件人。测试不在集群模式下运行,所有操作都在同一台机器上执行,但不一定在同一个线程中。

另一种解决方案是以某种方式检查 EventBus 现在是否为空,但据我了解,这是不可能的。

还有其他(更好的)解决方案吗?

0 投票
1 回答
280 浏览

java - Vertx 事件总线回复处理程序未为特定调用调用

我正在运行 vertx 的本地实例。路由器将我的请求重定向到具有以下处理程序的工作节点:

processRequest 函数接受请求正文,调用两个外部服务,聚合响应,然后返回给客户端。

当我点击上述 API 时,我的请求超时。分配用于执行我的请求的工作池中的线程在 Tag1 处被永久阻塞。在进一步调试时,我发现 Tag2 中调用的回复处理程序没有被调用。

服务 verticle (serviceVerticleAddr1) [ie Tag2] 中的处理程序为使用它的其他 API 返回正确的响应,但对我来说它被阻塞了。有人可以帮我确定原因吗?当调用 vertx.eventBus().request [Tag2] 的线程开始在 service1Response.join() [Tag1] 处等待未来完成时,是否会形成某种死锁?