问题标签 [vertx-verticle]
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.
vert.x - Creating multiple HTTP servers on the same host/port
I want to run multiple, non-clustered verticles on my webserver. Each verticle is started by a separate process/commandline and creates his own HTTP server (vertx.createHttpServer) for the same host and the same port with unique routes. However, this does not seem to work because after starting one verticle, all further verticles throw a BindException "Address already in use".
As a Vert.x novice I can only think of two ways to get passed this:
- Programmatically deploy all verticles from a single process, and make all verticles use a global router instance for adding their specific routes.
- Cluster the verticles and create an additional verticle that provides a webserver which allows to setup routes and handle requests and response via the clustered eventbus.
Both approaches would force me to rewrite large parts of my verticles.
Is there another way to circumvent this multiserver issue?
vert.x - Vert.X 3 中的模块
我是 Vert.X 的新手,我很想知道 Vert.X 3 中的模块系统与 2 中的模块系统有何不同,我找不到任何有用的文档。
mockito - 如何模拟 EntityBus.rxSend()
该io.vertx.reactivex.core.eventbus.EventBus.rxSend()
方法具有以下签名:
模拟它以使其返回Single
包含真实对象的正确方法是什么?问题是Message
该类没有构造函数,除了一个接受另一个Message
对象的构造函数。所以下面会编译:
但当然Single.just(new Message<Object>(null))
不包含一个真实的对象,然后可以将其传递给测试verticle中的下一个处理程序。
谢谢
rx-java - 是否可以生成引用 rx vertx 实例的 vertx 服务代理?
我正在尝试开发一个数据库服务代理并使用一个扩展 io.vertx.reactivex.core.AbstractVerticle 的 Verticle,以便我可以在数据库调用周围使用 rxJava 语义。问题是,当我编码生成服务代理时,我得到了这个:
数据库服务负责处理共享的 dbclient,我正在这样做:
是否可以使用@ProxyGen 创建一个在服务中引用 rxJava 的代理客户端?
作为参考,该接口声明了工厂方法以通过遵循 vertx.io 文档来实例化服务。
帮助和洞察力将不胜感激。
mockito - 使用 mockito 测试异步 Vertx 和 RxJava 方法
我有一个在 上发送消息的类vert.x event bus
,然后处理来自事件总线使用者的回复。当类运行时,它调用在构造函数或特定方法调用中传递给它的对象上的方法。
为了验证传入的对象上的方法是否确实被调用,使用 Mockito 模拟该对象。下面是测试类的基本结构:
这仅在某些时候有效。问题是,当dao
类向 发送异步消息vert.x event bus
并处理响应时,这一切都发生在与join()
调用正在等待的线程不同的线程中,因此Mockito.verify
可能发生在 vertx 管理的线程完成之前.
构建这些测试的最佳方法是什么,以便 Mockito 将等待所有相关的异步线程完成?
谢谢
java - 如何更改spring mockmvc的http端口
我正在开发一个具有三个端点的简单 api,使用vertx
.
该 api 有一些我无法修改并且需要通过的预定义测试,这些测试使用:
完成 api 后,我发现当我使用 verticles 时,我不需要提供 spring boot 启动器依赖的嵌入式 tomcat,所以我删除了它。
哪个是我的问题?
我不能排除嵌入式tomcat,因为spring boot需要它,否则我会得到以下错误:The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
as vertx verticle and tomcat listen to the same port (8080).
这里的问题是,例如,我可以将 Verticle 端口更改为 8081,但测试需要在端口 8080 上执行。我该如何解决这个问题,以便测试监听我部署的 Verticle(这也创建了一个 http 服务器)?
基本上我想知道是否有可能MockHttpServletResponse
使用由verticle而不是嵌入式tomcat创建的vertx服务器。
vert.x - 试图覆盖 vert.x 使用的 JUL 记录器
我想使用 Log4j2 并正在使用系统属性设置我的 MainVerticle 来做到这一点,
然后我从这个verticle部署我的HttpVerticle,在HTTP verticle中,我尝试使用参数化语句,但这些语句不起作用。所以我添加了几个日志语句来显示正在使用的记录器委托,以及系统属性:
在传入消息的处理程序下面,我正在使用它:
请注意,我使用连接添加 message.body() 以证明消息不是空字符串。
这些日志语句的输出是:
对于字母“b”的传入消息:
我尝试在 pom.xml 文件和命令行中使用 -D 参数设置系统属性。
这是 vert.x 3.5.3
关于我忘记做什么的任何想法?
=================
编辑:从评论线程中捕获要点。
- 无法在 verticle 中设置系统属性,因为 vert.x JUL 记录器在主 verticle 之前启动。
- 使用 vertx 插件运行代码时,无法在 pom.xml 中设置 ...。mvn vertx 插件必须在 vertx 初始化后被调用。
- 似乎可以覆盖 JUL 记录器的唯一方法是命令行,使用 -D vargs。
- 不要忘记在 -jar 开关之前设置 vargs,即 $ java -Dx=y -jar jarname.jar
kotlin - 尝试调用运行阻塞时,带有 Coroutines 的 Kotlin Vertx 阻塞
我正在使用公开了回调函数的第三方库。回调函数将在成功时调用。回调函数不是挂起函数,但是当我尝试在非挂起函数内部进行调用以返回挂起函数的结果时,该函数使用 aysnc 和 await 进行 IO 调用,调用永远不会被强制执行。下面我想出了一个简单的代码片段来演示这个问题。
如果我删除 makeSuspendFunCall 中的延迟函数,程序运行良好,但如果我添加延迟函数,它会挂起。我实际上是在这里使用延迟函数模拟挂起函数网络调用。在这种情况下,如何从 awaitBlockingExample 获得结果?我清楚地明白,通过将 awaitBlockingExample 作为挂起函数,我可以完成这项工作并删除异步并在内部运行阻塞调用。但是这里 awaitBlockingExample (非挂起函数)代表了一个由本方库提供的实现,它在我们的实现中被覆盖。比如guava缓存提供了reload函数,我想重写reload函数(非挂起函数),并从reload方法中调用协程函数来刷新数据库或网络调用的缓存值。
vert.x - 与所有 Verticle 实例共享对象
我的应用程序,一个 API 服务器,被认为是按如下方式组织的:
MainVerticle
在启动时调用,应该为应用程序工作创建所有必要的对象。主要是一个 mongoDB 连接池 (MongoClient.createShared(...)
) 和一个在实例范围内可用的全局配置对象。它还启动 HTTP 侦听器,一个HttpVerticle
.HttpVerticle
负责接收请求,根据xxx
payload中的命令执行XxxHandler.handle(...)
方法。大多数
XxxHandler.handle(...)
方法都需要访问数据库。此外,其他一些人还将使用来自全局 conf 的参数部署额外的 verticles。例如LoginHandler.handle(...)
,将部署一个 verticle 以在他连接时保持用户状态,并且当用户注销时,该 verticle 将被取消部署。
我不知道如何在“子”-verticle 中XxxHandler.handle(...)
或在“子”-verticle 中获取全局配置对象。对于 mongo 客户端也是如此。
Q1:对于配置数据,我尝试使用SharedData
. 在 `MainVerticle.start() 我有:
在 `HttpVerticle.start() 我有:
但日志输出是var=null
....我做错了什么?
Q2:除了这个带有<String, String>
地图类型的基本示例之外,如果该值是一个可变对象JsonObject
,就像我真正需要的那样怎么办?
Q3:最后如何让mongo客户端的实例对所有的verticles可用?
asynchronous - 使用 Vertx Unit 从回调中失败单元测试的正确方法
给定以下单元测试,它使用Vertx 单元测试框架:
调用向fail()
控制台抛出异常,但它实际上并没有使测试本身失败,它成功完成并且是绿色的。
使用Mockito时也是如此。我可以使用 mock 成功验证 Verticle 的行为及其依赖关系,但即使 Mockito 断言失败,测试本身仍然会通过。在 vertx TestContext 对象上调用 fail - context.fail()
- 也不会使测试失败。
核心问题是:任何对fail()
after的调用async.complete()
都不会导致测试失败,只有控制台会显示错误。但是如果不调用async.complete()
,则在调用测试断言之前,verticle 中的代码(在从事件总线消费时调用)将不会运行。
如果没有调用async.complete()
,测试将永远不会完成。
对此的正确方法是什么?
谢谢