经过最近的 Spring 启动版本升级,而索引数据到Elasticsearch通过 Camel ,我的端点失败.
Old version New version
Spring Boot: 2.5.2 2.6.2
camel-core: 3.11.1 3.14.0
camel-elasticsearch-rest-starter 3.11.1 3.14.0
Elasticsearch: 7.8.0 7.15.2
例外情况:
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.common.CheckedConsumer
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[?:?]
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
at org.apache.camel.component.elasticsearch.ElasticsearchProducer$HighLevelClient.<init>(ElasticsearchProducer.java:347) ~[camel-elasticsearch-rest-3.14.0.jar:3.14.0]
at org.apache.camel.component.elasticsearch.ElasticsearchProducer$HighLevelClient.<init>(ElasticsearchProducer.java:345) ~[camel-elasticsearch-rest-3.14.0.jar:3.14.0]
at org.apache.camel.component.elasticsearch.ElasticsearchProducer.process(ElasticsearchProducer.java:124) ~[camel-elasticsearch-rest-3.14.0.jar:3.14.0]
at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:66) ~[camel-support-3.11.1.jar:3.11.1]
尝试了下面的东西,但没有一个有用的。
- Elasticsearch RestHighLevelClient missing transitive dependencies
- 将Apache Camel版本从3.11.1增加到3.14.0,使其与Spring启动版本兼容。
我观察到的一件事是,前面提到的类CheckedConsumer已经移到了Elasticsearch版本7.8.0和7.15.2之间的不同包中。我假设,将camel增加到3.14.0应该可以解决这个问题,但它仍然指的是旧包。
Old package: org.elasticsearch.common.CheckedConsumer
New package: org.elasticsearch.core.CheckedConsumer
1条答案
按热度按时间xwmevbvl1#
此错误发生在类ElasticsearchProducer中。在内部类HighLevelClient中,存在如下代码:
第二个参数的类型为org.elasticsearch.common.CheckedConsumer,这就是为什么我们会得到这个错误。如果你可以访问camel-elasticsearch-rest库的源代码,你可以创建自己的camel类扩展:
在类CustomElasticsearchComponent中,应覆盖方法createEndpoint:
在类CustomElasticsearchEndpoint中,应覆盖方法createProducer:
最后,在类CustomElasticsearchProducer中,您应该覆盖方法process:这里只是从ElasticSearchProducer复制带有私有方法和内部类代码。
这是一个非常庞大的解决方案,也许我们可以用AOP或其他方法来修复它,但我不知道该怎么做。
我知道现在很晚了,但也许这对某人会有帮助