Apache Camel Elasticsearch端点失败,出现ClassNotFoundException异常:org.elasticsearch.common.CheckedConsumer

kqhtkvqz  于 2023-01-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(244)

经过最近的 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]

尝试了下面的东西,但没有一个有用的。

我观察到的一件事是,前面提到的类CheckedConsumer已经移到了Elasticsearch版本7.8.0和7.15.2之间的不同包中。我假设,将camel增加到3.14.0应该可以解决这个问题,但它仍然指的是旧包。

Old package:  org.elasticsearch.common.CheckedConsumer
New package:  org.elasticsearch.core.CheckedConsumer
xwmevbvl

xwmevbvl1#

此错误发生在类ElasticsearchProducer中。在内部类HighLevelClient中,存在如下代码:

super(restClient, client -> {}, Collections.emptyList());

第二个参数的类型为org.elasticsearch.common.CheckedConsumer,这就是为什么我们会得到这个错误。如果你可以访问camel-elasticsearch-rest库的源代码,你可以创建自己的camel类扩展:

CustomElasticsearchProducer extends ElasticsearchProducer
CustomElasticsearchEndpoint extends ElasticsearchEndpoint
CustomElasticsearchComponent extends ElasticsearchComponent

在类CustomElasticsearchComponent中,应覆盖方法createEndpoint:

@Override
    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
        ...
        return new CustomElasticsearchEndpoint(...);
    }

在类CustomElasticsearchEndpoint中,应覆盖方法createProducer:

@Override
public Producer createProducer() throws Exception {
    ...
    return new CustomElasticsearchProducer(this, configuration);
}

最后,在类CustomElasticsearchProducer中,您应该覆盖方法process:这里只是从ElasticSearchProducer复制带有私有方法和内部类代码。
这是一个非常庞大的解决方案,也许我们可以用AOP或其他方法来修复它,但我不知道该怎么做。
我知道现在很晚了,但也许这对某人会有帮助

相关问题