Apache Spark在Jersey依赖项注入方面表现不佳

哈代

我正在尝试使用该com.github.sps.metrics.metrics-opentsdb库将指标从我的Spark作业记录到我的OpenTSDB服务器。我遇到一个问题,在处理EncodingFilters的球衣代码中,我得到了一个奇怪的NPE。

这是我得到的例外:

ERROR OpenTsdb: send to opentsdb endpoint failed
javax.ws.rs.ProcessingException: java.lang.NullPointerException
    at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:582)
    at org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:564)
    at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1148)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1098)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:428)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1635)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1630)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.post(WebClient.java:1570)
    at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.post(InvocationBuilderImpl.java:145)
    at com.github.sps.metrics.opentsdb.OpenTsdb.sendHelper(OpenTsdb.java:176)
    at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:162)
    at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:138)
    at com.adobe.gto.gateway.common.metrics.Metrics$RunnableMetricRecorder.run(Metrics.java:220)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at org.glassfish.jersey.client.filter.EncodingFilter.getSupportedEncodings(EncodingFilter.java:110)
    at org.glassfish.jersey.client.filter.EncodingFilter.filter(EncodingFilter.java:84)
    at org.apache.cxf.jaxrs.client.spec.ClientRequestFilterInterceptor.handleMessage(ClientRequestFilterInterceptor.java:60)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:652)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1097)`

我查看了EncodingFilter.class中的代码,看到我失败的行是这样的:

List<ContentEncoder> encoders = serviceLocator.getAllServices(ContentEncoder.class);

在类中,我看到未实例化serviceLocator,而是在类顶部看到了以下行:

@Inject
private ServiceLocator serviceLocator;

我最初以为这可能是一个不好的依赖关系,所以我检查my mvn dependency:tree并确保cxf和jersey项目的所有版本都匹配,所以我不认为这是问题所在。现在,我认为它与Apache Spark特别相关,我认为这是因为我有一个使用相同metrics-opentsdb的单独应用程序,而我从未见过上述异常,因此在我的其他应用程序中一切正常。

那么,有谁知道球衣依赖注入和火花是怎么回事?有没有人处理过同样的问题并解决了?这个问题是否还存在?

哈代

一位同事指出CXF和Jersey是竞争产品,并建议我删除CXF,因为该metrics-opentsdb库表示它使用Jersey。因此,我重新编写了使用CXF的应用程序的一部分,并<exclusions>在我的一个依赖项中添加了一个部分pom.xml,现在一切似乎都可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章