Scala 2.12与Java 8互操作:Finagle代码编译失败求助
解决Finagle Java客户端的私有成员访问编译错误
我来帮你搞定这个问题!你遇到的编译错误,核心原因是Finagle的Scala API和Java API设计差异:Scala里那些链式的嵌套配置属性(比如withTransport、withSessionQualifier)在Java版的Http.Client中是私有成员,不能直接用点语法访问。Java API提供了专门的构建器类来完成这些配置,我们只需要调整代码的调用方式即可。
修正后的Java代码
import com.twitter.finagle.Http; import com.twitter.finagle.Service; import com.twitter.finagle.http.Request; import com.twitter.finagle.http.Response; import com.twitter.finagle.stats.StatsReceiver; import com.twitter.finagle.tracing.Tracer; import com.twitter.finagle.transport.Transport; import com.twitter.finagle.session.SessionQualifier; import com.twitter.finagle.session.Session; import com.twitter.finagle.pool.SessionPool; import com.twitter.util.Duration; public class JavaMain { public static void main(String[] args) { StatsReceiver statsReceiver = null; Tracer tracer = null; Duration requestTimeout = null; Duration connectTimeout = null; Service<Request, Response> client = Http.client() .withLabel("clientname") .withStatsReceiver(statsReceiver) .withTracer(tracer) .withRequestTimeout(requestTimeout) // 替换Scala的.withTransport.connectTimeout .withTransport(Transport.client().connectTimeout(connectTimeout)) // 替换Scala的.withSessionQualifier.noFailureAccrual .withSessionQualifier(SessionQualifier.client().noFailureAccrual()) // 替换Scala的.withSessionQualifier.noFailFast .withSessionQualifier(SessionQualifier.client().noFailFast()) // 替换Scala的.withSession.acquisitionTimeout .withSession(Session.client().acquisitionTimeout(connectTimeout)) // 替换Scala的.withSessionPool.maxSize .withSessionPool(SessionPool.client().maxSize(1)) .newService("localhost:10000,localhost:10001"); } }
关键修改点说明
每一处错误都对应了Scala到Java的API适配:
withTransport.connectTimeout:Java中不能直接访问withTransport私有字段,我们用Transport.client()创建Transport配置器,设置连接超时后传入Http.client().withTransport()方法。withSessionQualifier.noFailureAccrual()/noFailFast():通过SessionQualifier.client()构建SessionQualifier配置实例,调用对应的禁用方法后,传入withSessionQualifier()完成配置。withSession.acquisitionTimeout:使用Session.client()创建Session配置器,设置会话获取超时后传入withSession()。withSessionPool.maxSize:用SessionPool.client()创建连接池配置器,设置最大连接数后传入withSessionPool()。
另外注意补充导入了几个Finagle的配置类,这些是完成配置必须的依赖类。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

