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

维特。x在垂直线之间发送NetSocket

柏明亮
2023-03-14

我正在使用Vert创建一个简单的TCP服务器。x和数据以压缩数据包的形式在客户端和服务器之间发送。

我想使用垂直线来创建这种性质的东西(其中[something]是垂直线,箭头显示数据流):

Buffer In -> [Decompress Packet] -> [Parse Packet] -> Reply to NetSocket

问题是,我不确定如何将NetSocket从一个版本(结果从Decompress数据包)携带到下一个版本。我当然可以发送的结果从解压包解析包的版本,但当解析包的版本收到这个数据,它将没有任何句柄来使用引用它来回复NetSocket必须给发件人。

本质上,我需要通过事件总线携带NetSocket,这样一旦到达最终垂直点,它就可以回复数据。

共有2个答案

微生曾琪
2023-03-14

实际上,不必在顶点之间传递NetSocket。

在垂直方向。x、 每个套接字都会自动在事件上注册一个处理程序,您可以在场景中使用它。请在此处查看文档:

每个套接字都会自动在事件总线上注册一个处理程序,当这个处理程序中接收到任何缓冲区时,它会将它们写入自己。

这使您能够将数据写入可能位于完全不同垂直方向甚至不同垂直方向的html" target="_blank">套接字。通过将缓冲区发送到该处理程序的地址。

处理程序的地址由writeHandlerID提供

由于writeHandlerID是一个普通字符串,所以从verticle1将其发送到verticle2并不是什么大问题。在verticle2,eventbus。发送(writeHandlerID[你想回复的东西])。就这样。

我们已经在应用程序中应用了此技巧。

邵畅
2023-03-14

正如评论中所说的,你可能需要一组处理程序,而不是竖线。例如,看看vertx web处理程序是如何工作的。处理程序是一个简单的lambda,它执行一个小任务,可以决定将工作传递给下一个任务,或者调用失败方法中止执行。

一个非常基本的实现就是保留一个添加的lambda(Java函数接口)列表,一旦收到套接字,就迭代该列表。

如果需要在处理程序中执行异步IO,则不能使用需要异步执行的简单迭代器,基本异步迭代器包装可以是:

abstract class AsyncIterator<T> implements Handler<T> {

  private final Iterator<T> iterator;
  private boolean end = false;

  public AsyncIterator(Iterable<T> iterable) {
    this(iterable.iterator());
  }

  public AsyncIterator(Iterator<T> iterator) {
    this.iterator = iterator;
    next();
  }

  public final boolean hasNext() {
    return !end;
  }

  public final void next() {
    if (iterator.hasNext()) {
      handle(iterator.next());
    } else {
      end = true;
      handle(null);
    }
  }

  public final void remove() {
    iterator.remove();
  }
}

你只需要像这样使用它:

new AsyncIterator<Object>(keys) {
    @Override
    public void handle(Object key) {
      if (hasNext()) {
        // here your handler code...
        // once it is complete your handler need to call:
        next();
      } else {
        // no more entries to iterate...
        // close your socket?
      }
    }
  };
});
 类似资料:
  • 我对Vert.x非常陌生,就像几天前一样。我来自一个JAX式的,安逸的世界。我可能大错特错,请指正。 我的问题是:如何使顶点公开自己的REST接口(子路由器),以及如何将其子路由器注册到应用程序的主路由器中? 我尝试过类似的东西,但是当我请求/产品/所有:( } }

  • 我的第一个Vertx Web应用程序: 我希望得到索引。本地主机上的html。8080/Test然后找到一种方法来检索数据,但页面没有显示 我有一个RequestResponseExample类: 和我的Html代码index.html

  • 无法建立垂直。云环境中垂直柱之间的x群集 我在配置vert时遇到问题。x eventbus群集在私有云环境中。 在实验室测试中,我尝试使用Hazelcast集群管理器制作两个垂直点来建立一个集群,每个垂直点都在您自己的容器中运行。 问题很可能是由于配置错误引起的,但我无法找到它。在这个云上,不可能进行多播调用,那么我使用的是TCP IP发现策略。 最初的计划是制作一个“labatf api”垂直链

  • 假设我有一个类似这样的竖线(有意简化以便于解释我的问题)。 现在想象一下,MyService是事件驱动的,当服务中发生某些事件时,我想停止顶点。 是否有人对Vert有更多经验。x知道如何做到这一点?或者,也许有人会给我一些建议,告诉我什么是正确的替代方法?

  • 我有一个vert。x标准Verticle基本上,它解析HttpRequest并准备JsonObject,然后我通过事件总线发送JsonObject。在另一个Worker verticale中,该事件被消耗,并将启动执行(包括对Penthao数据集成Java API的调用),它正在阻止API。完成“.kjb”文件的执行大约需要30分钟。但是vert。x不断警告Worker线程块,所以我的问题是ver

  • 我知道,在vert. x中,默认的版本将在每次我们不需要在处理程序中写入线程安全时运行在相同的事件循环中。 例如,如果我有一个运行HttpServer的版本- } 可以保证,在任何时候,我的请求处理程序都会在两个事件循环上被调用两次(针对2个不同的请求)。因此,我不必在请求处理程序中处理线程安全问题。 如果我运行多个HttpServer顶点实例- 我需要注意线程安全吗?多个请求处理程序(最大值=1