最近在用finagle,碰到的几个坑:
1. 如果想直接用java调用scala启动httpserveradmin,service需要start
AdminHttpService admin = new AdminHttpService(
9090, 123, new RuntimeEnvironment(this));
TimeSeriesCollectorFactory seriesCollectorFactory = new TimeSeriesCollectorFactory();
seriesCollectorFactory.apply(Stats.get(""), admin).start();
admin.start();
filter
new SimpleFilter().andThen.(SimpleFilter).andThen....
这种形式连续调用下去是可以的。
如果想把Filter放入list,然后遍历出来调用。这样:
CopyOnWriteArrayList> chain = env.getFilters();
Filter tmp = null;
for (SimpleFilter filter : chain) {
if (tmp != null) {
tmp = tmp.andThen(filter);
} else {
tmp = filter;
}
}
Server server = ServerBuilder.safeBuild(
tmp.andThen(httpserver),
ServerBuilder.get()........
andThen的代码如下:
def andThen[Req2, Rep2](next: Filter[ReqOut, RepIn, Req2, Rep2]) =
new Filter[ReqIn, RepOut, Req2, Rep2] {
def apply(request: ReqIn, service: Service[Req2, Rep2]) = {
Filter.this.apply(request, new Service[ReqOut, RepIn] {
def apply(request: ReqOut): Future[RepIn] = next(request, service)
override def release() = service.release()
override def isAvailable = service.isAvailable
})
}
}