【发布时间】:2014-03-04 13:52:01
【问题描述】:
当尝试通过 StormSubmitter 提交我的拓扑时,我得到 -
Caused by: java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
我正在使用 Spring。
我没有在 Spout/Bolt 构造函数中初始化 HttpClient。而是在 prepare() 螺栓方法中从 Spring 上下文中获取的类的构造函数中初始化
代码结构如下-
SomeBolt.java
@Component
public class SomeBolt extends BaseRichBolt {
private OutputCollector _collector;
private SomeClient someClient;
@Override
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
_collector = collector;
someClient = AppContext.getBean(SomeClient.class);
}
}
SomeClient.java
@Component
public class SomeClient {
private final CloseableHttpClient httpClient;
public SomeClient() {
this.httpClient = (httpClient == null ? HttpClients.createDefault() : httpClient);
}
}
AppContext.java
@Component
public class AppContext implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
AppContext.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> c) {
return applicationContext.getBean(c);
}
}
【问题讨论】:
-
@K.C.感谢您的评论。这似乎是 httpcore:4.2 和 4.3 都在 uberjar 中的问题。但即使解决了这个问题,也没有解决问题。
-
@K.C.看来,这实际上是问题所在。我们的storm包提供httpcore-4.2.5(因此以
storm jar /path/to/jar.jar运行任何东西都会有重复的依赖。[请添加您的评论作为答案,我会接受它] -
谢谢,我赞成你的问题。
标签: java spring httpclient apache-storm