当前位置: 首页 > 知识库问答 >
问题:

在Vertx中,通过事件总线发送对象集合的最佳方式是什么?

吉玉宸
2023-03-14

我有一个处理程序,在给定的endpoint上处理HTTP请求。处理程序通过事件总线发送一条垂直消息,该消息发出一些外部分页的REST调用,聚合结果,并将结果返回给处理程序。分页REST调用的结果表示为自定义对象列表。如果我只是尝试发送列表本身,Vertx会抛出一个异常,抱怨它找不到java的编解码器。util。ArrayList

我试图在Vertx中找到“最好的”——也就是最简单、最高效、最可读/可维护的——方法,通过事件总线将这些对象的列表发送回我的处理程序。这些都是我知道的,并且到目前为止已经尝试过的选项,有没有更好的方法来实现这一点?

  1. 将列表序列化为JSON并存储在JsonObject中。这需要在两端进行显式序列化/反序列化,这似乎是不必要的:
// Verticle
List<CustomObject> result = method();
JsonObject data = new JsonObject();
data.put("result", Json.encode(result));
msg.reply(data);

// Handler
String serializedList = body.getString("result");
List<CustomObject> list = objectMapper.readValue(serializedList, new TypeReference<List<CustomObject>>(){});

有没有一种更简单的方法适合我的用例,而我却不知道?谢谢

共有1个答案

郎雅昶
2023-03-14

很抱歉,这里有一个很长的例子,但你可以这样做:

public class EventBusHolder {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();

        vertx.eventBus().registerDefaultCodec(Holder.class, new HolderCodec());
        vertx.deployVerticle(new SomeVerticle(), (r) -> {
            vertx.eventBus().send("custom", new Holder(new CustomObject("a")));
        });
    }
}

class HolderCodec implements MessageCodec<Holder, Holder> {

    @Override
    public void encodeToWire(Buffer buffer, Holder holder) {

    }

    @Override
    public Holder decodeFromWire(int pos, Buffer buffer) {
        return null;
    }

    @Override
    public Holder transform(Holder holder) {
        return holder;
    }

    @Override
    public String name() {
        return "HolderCodec";
    }

    @Override
    public byte systemCodecID() {
        return -1;
    }
}

class SomeVerticle extends AbstractVerticle {

    @Override
    public void start() {
        vertx.eventBus().consumer("custom", (msg) -> {
           System.out.println(msg.body());
        });
    }
}

class CustomObject {
    public String name;

    public CustomObject(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "CustomObject{" +
                "name='" + name + '\'' +
                '}';
    }
}


final class Holder {
    @Override
    public String toString() {
        return "Holder{" +
                "data=" + data +
                '}';
    }

    private final List<CustomObject> data;

    public Holder(final CustomObject... data) {
        this.data = Arrays.asList(data);
    }

    public List<CustomObject> getData() {
        return data;
    }
}

请注意,编码ToWire解码器FromWire没有实现。本地消息不会调用它们。

拥有此Holder对象是绕过JVM上类型擦除的一种简单方法。

 类似资料:
  • 问题内容: 我想过滤java.util.Collection基于谓词的。 问题答案: Java 8(2014)在一行代码中使用流和lambda解决了此问题: 这是一个教程。 使用修改收集到位。(注意:在这种情况下,谓词将删除满足该谓词的对象): 允许过滤集合而无需编写循环或内部类: 你能想象一些更具可读性的东西吗?

  • 问题内容: 我们使用Backbone + ReactJS捆绑包来构建客户端应用程序。严重依赖臭名昭著的是,我们通过自己的支持ReactJS接口进行双向绑定的包装器将值直接传播到模型。 现在我们面对这个问题: 我们有一个插件,可以通过编程方式格式化输入值,因此不会触发React事件。当模型从用户输入中接收 未格式化的 值而从插件中 丢失格式化的 值时,所有这些都会导致情况。 似乎React依赖于浏览

  • 问题内容: 我们有两个PHP5对象,并希望将其中一个的内容合并到第二个中。它们之间没有子类的概念,因此以下主题中描述的解决方案不适用。 备注: 这些是对象,而不是类。 对象包含很多字段,所以 foreach 会很慢。 到目前为止,我们考虑将对象A和B转换为数组,然后在重新转换为对象之前使用 array_merge() 合并它们,但是我们不能为此感到骄傲。 问题答案: 如果您的对象仅包含字段(没有方

  • 问题内容: 我在vert.x微服务中没有做太多事情,但是我遇到了一个疑问,即使用一些我不知道的中间件或Web客户端或其他任何方式来相互了解错误服务vert.x的最佳通信方式.x允许我。 问题答案: 允许vert.x微服务在它们之间进行通信的可能性是无限的,每种情况各有利弊,并取决于上下文。 这是3种常见方式: 1)使用本机vert.x eventBus(异步逻辑):https ://vertx.i

  • 本文向大家介绍在事件侦听上调用event.preventDefault()的最佳方式是什么?相关面试题,主要包含被问及在事件侦听上调用event.preventDefault()的最佳方式是什么?时的应答技巧和注意事项,需要的朋友参考一下 在事件侦听上调用event.preventDefault()的最佳方式是什么?

  • 我对Vertx很陌生,但我对测试它与Spring的集成很感兴趣。我使用Spring Boot来提升项目,并部署了两个顶点。我希望他们使用事件总线相互通信,但失败了。这就是我所做的: > 在主应用程序中: @SpringBootApplication公共类MySpringVertxApplication{@Autowired MyRestAPIServer MyRestAPIServer;@Auto