我正在使用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?
}
}
};
});