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

我想使用Verticles创建这种性质的东西(其中[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,它便可以回复数据。

最佳答案

正如评论中所说,您可能需要一组处理程序而不是Verticles。例如,查看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?
      }
    }
  };
});

07-27 19:34