我正在使用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,它就可以回复数据。
答案 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,[你要回复的东西])。那就是它。
我们已将此提示应用于我们的应用程序中。