java spring httpclient apache-storm

java.lang.NoSuchFieldError: INSTANCE



spring httpclient (4)

Cuando trato de enviar mi topología a través de StormSubmitter, estoy obteniendo ...

Caused by: java.lang.NoSuchFieldError: INSTANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)

Estoy usando Spring.

No estoy inicializando HttpClient en Spout / Bolt Constructor. En su lugar, se inicializa en el constructor de una clase que se va a buscar desde Spring Context en el método de cálculo de prepare()

El código está estructurado de la siguiente manera:

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); } }



Harsh tiene razón, está en el camino de clase de la tormenta.

Entonces, lo que hice para que esto funcionara fue eliminar el httpclient y el httpcore que viene con storm y reemplazarlos con la versión más nueva 4.3.3 y 4.3.2, respectivamente. Esto cambia la classpath que works / nimbus / supervisor usa para comenzar. Puede ejecutar classpath de tormenta e imprimir la ruta de clase.

[nimbus ~]$ storm classpath ...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....

No estoy seguro de que este sea un buen trabajo, no estoy seguro de qué parte de la tormenta usa este contenedor.

si miras el código de la storm pitón, ves que pondrá todos los frascos en la raíz de la tormenta y 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))


Me enfrenté a un problema similar al siguiente, en mi ruta de clase había dos jar que contenían la misma clase, httpcore-4.3 y apache-httpcomponents-httpcore, eliminé apache-httpcomponents-httpcore de classpath, resolvió el problema.


Tenía los archivos jar a continuación en la ruta dentro de la carpeta del complemento:
./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

Después, eliminé el archivo de abajo, funcionó para mí
/var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar