Lorsque j'essaie de soumettre ma topologie via StormSubmitter, je reçois -
Caused by: Java.lang.NoSuchFieldError: INSTANCE
at org.Apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.Java:52)
J'utilise Spring.
Je n'initialise pas HttpClient dans Spout/Bolt Constructor. Au lieu de cela, il est initialisé dans le constructeur d'une classe qui est récupérée à partir de Spring Context dans la méthode prepare()
de bolt
Le code est structuré comme suit -
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);
}
}
Il s'agit probablement d'un problème de dépendance.
C'est un message d'erreur très peu clair mais j'ai trouvé quelque chose de similaire ici: Hibernate NoSuchFieldError INSTANCE mais uniquement avec Struts 1?
J'ai rencontré un problème similaire comme celui-ci, dans mon chemin de classe, il y avait deux pots contenant la même classe, httpcore-4.3 et Apache-httpcomponents-httpcore, j'ai supprimé Apache-httpcomponents-httpcore du chemin de classe a résolu le problème.
Harsh a raison dans son chemin de classe de tempête.
Donc, ce que j'ai fait pour que cela fonctionne, a été de supprimer les httpclient et httpcore fournis avec Storm et de les remplacer par les versions 4.3.3 et 4.3.2 plus récentes respectivement. Cela modifie le chemin de classe que works/nimbus/supervisor utilise pour démarrer. Vous pouvez exécuter le chemin de classe Storm et imprimer le chemin de classe.
[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....
Je ne suis pas sûr que ce soit un très bon travail, je ne sais pas quelle partie de la tempête utilise ce pot.
si vous regardez le code python storm vous voyez qu'il mettra tous les pots dans la racine de la tempête et la tempête/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))
J'avais les fichiers jar ci-dessous dans le chemin à l'intérieur du dossier du plugin:
./ 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
Après, j'ai supprimé le fichier ci-dessous, cela a fonctionné pour moi
/ var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar