StormSubmitterを使用してトポロジを送信しようとすると、
_Caused by: Java.lang.NoSuchFieldError: INSTANCE
at org.Apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.Java:52)
_
私はSpringを使用しています。
Spout/Bolt ConstructorでHttpClientを初期化していません。代わりに、ボルトのprepare()
メソッドでSpring Contextからフェッチされるクラスのコンストラクターで初期化されます
コードの構造は次のとおりです-
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);
}
}
_
これはおそらく依存関係の問題です。
非常に不明瞭なエラーメッセージですが、次のようなものが見つかりました: Hibernate NoSuchFieldError INSTANCEしかしStruts 1のみ?
私はこのような同様の問題に直面しました。私のクラスパスには、同じクラスを含む2つのjar、httpcore-4.3とApache-httpcomponents-httpcoreがあり、クラスパスからApache-httpcomponents-httpcoreを削除して問題を解決しました。
厳しいのは、まさに嵐のクラスパスです。
そのため、この作業を行うために行ったのは、stormに付属しているhttpclientとhttpcoreを削除し、それぞれ新しいバージョン4.3.3と4.3.2に置き換えたことです。これにより、works/nimbus/supervisorが起動に使用するクラスパスが変更されます。ストームクラスパスを実行すると、クラスパスが出力されます。
[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....
これが非常に良い回避策であるかどうかはわかりません。ストームのどの部分でこのjarが使用されているかわかりません。
python storm コードを見ると、すべてのjarが置かれることがわかりますストームルートおよびstorm/lib
def get_classpath(extrajars):
ret = get_jars_full(STORM_DIR)
ret.extend(get_jars_full(STORM_DIR + "/lib"))
ret.extend(extrajars)
return normclasspath(":".join(ret))
プラグインフォルダー内のパスに以下のjarファイルがありました。
./ var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar
./ var/lib/jenkins/plugins/git-client/WEB-INF/lib/httpcore-4.3.2.jar
./ var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/httpcore-4.2.4.jar
その後、私は以下のファイルを削除しました、それは私のために働いた
/ var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar