Vert.x在Verticles之间发送NetSocket

时间:2016-05-26 17:09:46

标签: java sockets vert.x

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

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

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

问题在于我不确定如何将 NetSocket 从一个Verticle(Decompress Packet)的结果带到下一个。我当然可以将结果从Decompress Packet发送到Parse Packet Verticle但是当Parse Packet Verticle收到此数据时,它将没有任何句柄来使用它具有的引用来回复NetSocket发件人。

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

2 个答案:

答案 0 :(得分:1)

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

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

如果你需要在处理程序中执行异步IO,那么就不能使用一个简单的迭代器来进行async,一个基本的异步迭代器包装器可能是:

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?
      }
    }
  };
});

答案 1 :(得分:1)

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

在Vert.x中,每个套接字都会自动在事件上注册处理程序,您可以将其用于您的场景。检查文档here

  

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

     

这使您可以通过将缓冲区发送到该处理程序的地址,将数据写入可能位于完全不同的Verticle或甚至不同的Vert.x实例中的套接字。

     

处理程序的地址由writeHandlerID

给出

由于writeHandlerID是普通字符串,因此将它从verticle1发送到verticle2并不是什么大问题。在verticle2中,eventbus.send(writeHandlerID,[你要回复的东西])。那就是它。

我们已将此提示应用于我们的应用程序中。