- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我解释了我的问题,我有一个垂直体,我在其中定义了所有路线。我有简单的 java 类,其中包含我根据路线在 verticle 中调用的方法。例如,我的 downloadFile() 方法位于 MyFile 类中,如下所示:
public class MyFile {
public final void downloadFile(RoutingContext rc, Vertx vertx) {
final HttpServerResponse response = rc.response();
response.putHeader("Content-Type", "text/html");
response.setChunked(true);
rc.fileUploads().forEach(file -> {
final String fileNameWithoutExtension = file.uploadedFileName();
final JsonObject jsonObjectWithFileName = new JsonObject();
response.setStatusCode(200);
response.end(jsonObjectWithFileName.put("fileName", fileNameWithoutExtension).encodePrettily());
});
}
public final void saveFile(RoutingContext rc, Vertx vertx) {
//TODO
}
}
我在我的 verticle 中使用这个类,如下所示:
public class MyVerticle extends AbstractVerticle{
private static final MyFile myFile = new MyFile();
@Override
public void start(Future<Void> startFuture) {
final Router router = Router.router(vertx);
final EventBus eventBus = vertx.eventBus();
router.route("/getFile").handler(routingContext -> {
myFile.downloadFile(routingContext, vertx);
});
router.route("/saveFile").handler(routingContext -> {
myFile.saveFile(routingContext, vertx);
});
}
}
我的同事告诉我,在 verticle 中实例化一个类不好,当我问他为什么时,他回答说它会变得有状态,我对他对我说的话表示怀疑,因为我不知道如何实现。当我在 verticle 中声明 MyFile 类实例为“static Final”时,我想说我什至获得了性能提升,因为我对每个传入请求使用相同的实例,而不是创建一个新实例。
如果在 verticle 中实例化类不好,请解释原因?
此外,我想知道使用 2 个 verticle 进行只有一个 verticle 可以完成的治疗有什么好处?
例如,我想用我在数据库中选择的数据构建一个 JsonObject,为什么要将此数据发送到另一个 verticle 知道这个 verticle 除了构建 JsonObject 并等待它回答我将响应发送到客户端,以便我可以在发出请求的 verticle 中构建此 JsonObject 并立即将响应发送给客户端。我给你提供了一个伪代码以便更好地查看:
public class MyVerticle1 extends AbstractVerticle{
public void start(Future<Void> startFuture) {
connection.query("select * from file", result -> {
if (result.succeeded()) {
List<JsonArray> rowsSelected = result.result().getResults();
eventBus.send("adress", rowsSelected, res -> {
if (res.succeded()) {
routinContext.response().end(res.result().encodePrettily());
}
});
} else {
LOGGER.error(result.cause().toString());
}
});
}
}
public class MyVerticle2 extends AbstractVerticle{
public void start(Future<Void> startFuture) {
JsonArray resultOfSelect = new JsonArray();
eventBus.consumer("adress", message -> {
List<JsonArray> rowsSelected = (List<JsonArray>) message.body();
rowsSelected.forEach(jsa -> {
JsonObject row = new JsonObject();
row.put("id", jsa.getInteger(0));
row.put("name", jsa.getString(1));
resultOfSelect.add(row);
});
message.reply(resultOfSelect);
});
}
}
我真的不明白制作 2 个 verticle 的意义,因为我可以在第一个 verticle 中使用查询结果而不使用第二个 verticle。
对我来说,EventBus 对于将信息传输到 verticle 进行并行处理非常重要。
最佳答案
请记住...不幸的是,您正在寻找的答案非常微妙,并且会根据许多条件而有所不同(例如,回答者的经验、代码库中的设计习惯、您可以使用的工具/库) , ETC)。因此,没有权威的答案,只有适合您(和您的同事)的答案。
My colleague tells me that it is not good to instantiate a class in a verticle and when I asked him why, he replied that it becomes stateful and I have doubts about what he says to me because I see not how.
从一般意义上来说,您的同事是正确的,您不希望集群中的各个节点维护自己的状态,因为这实际上会阻碍可靠扩展的能力。但在这种特殊情况下,MyFile
似乎是无状态的,因此将其引入为 Verticle 的成员并不会自动使服务器有状态。
(如果有的话,我会对 MyFile
执行的不仅仅是基于文件的操作提出异议 - 它还处理 HTTP 请求和响应)。
And as I declared my MyFile class instance "static final" in my verticle, I want to say that I even gain in performance because I use the same instance for each incoming request instead of creating a new instance .
我想说这取决于设计偏好。这里本身没有任何真正的“伤害”,但我倾向于避免使用静态成员来表示常量文字以外的任何内容,而更喜欢使用依赖项注入(inject)来连接我的依赖项。但也许这是一个非常简单的项目,引入 DI 框架超出了您希望引入的复杂性。这完全取决于您的具体情况。
In addition I would like to know what is the interest of using 2 verticles for a treatment that only one verticle can do?
同样,这取决于您的具体情况和您的“复杂性预算”。如果处理很简单并且您希望保持设计同样简单,那么单个 Verticle 就可以了(并且可以说更容易理解/概念化和支持)。在较大的应用程序中,我倾向于沿着正在运行的不同逻辑域创建许多 Verticles(例如用于身份验证的 Verticles、用于用户帐户功能的 Verticles 等),并通过 EventBus 编排任何复杂的处理。
关于java - 在 verticle vert.x 中实例化类的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846546/
编辑:澄清一下,我明白为什么这段代码不起作用,我并不是要修复它,而是想了解如果这段代码可以在没有语义错误的情况下编译会有什么危险。 我发现下面的代码会导致静态语义错误。我知道这是因为 std::lis
我想知道 C# 枚举以及重复值会发生什么。我创建了以下小程序来测试: namespace ConsoleTest { enum TestEnum { FirstElem
正如我在另一个 SO 问题中指出的那样,我遇到了 this article .当我通过 MSVC7.1 编译 boost 1.40 时出现了这个问题,并且弹出了几个 C4251 警告。 现在,在阅读上
我有以下弹出窗口代码(客户端请求)。它使用 eval ,我知道这是危险的。有没有办法重写下面的脚本,使其不使用 (eval)? /* exported popup_default , popup_he
NTFS 文件可以有对象 ID。可以使用 FSCTL_SET_OBJECT_ID 设置这些 ID .然而,msdn article说: Modifying an object identifier c
我一直在学习命令行参数解析。关于这个已经有很长的线索了,我不想在这里挑起一个: Using getopts in bash shell script to get long and short com
这个问题在这里已经有了答案: How to configure ContextMenu buttons for delete and disabled in SwiftUI? (4 个回答) 4 个月
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O)。?在什么情况下中断处理程序中的 I/O 会导致 linux 系统中的死锁? 最佳答案 关于 printk(),它是侵入性的。例
不是 Invoking virtual function and pure-virtual function from a constructor 的重复项: 以前的问题与 C++ 03 相关,而不是
我正在使用 lateinit 属性以避免使用 ?运算符(operator)。我有很多 View 属性是第一次在 getViews() 函数中分配的。如果该功能不存在,我的应用程序将与来自 Kotlin
我最近在使用 fputs 时遇到了问题:当使用 fputs 在文本文件中打印一些字符串时,我碰巧得到了除 A-Z、a-z、0-9 之外的其他字符(不属于字符串的字符) .我绝对确保所有字符串都以空字符
在仅包含字节数组的结构上使用 #pragma pack(1) 是否危险/有风险?例如。这个: #pragma pack(1) struct RpcMessage { uint8_t proto
我是一名优秀的程序员,十分优秀!