我与聚合来自多个源数据的应用工作。在这种情况下,我需要使用不相关的数据连接到两个不同的Solr服务。为此我设置了两个不同的数据存储库。春天的Solr - 使用多个客户不同的服务
@Configuration
@EnableSolrRepositories(basePackages={"foo.utilities.solr.repos.gcr"}, multicoreSupport=true)
public class GcrSolrContext {
@Bean
public SolrClient solrClient() {
return new HttpSolrClient("http://foo:8086/solr/gcr");
}
@Bean
public SolrTemplate solrTemplate(SolrClient client) throws Exception {
return new SolrTemplate(client);
}
}
我的问题是,我无法弄清楚如何让两个完全独立的Solr的客户,在不同的URL指向每个:我已经定义如下豆。由于豆solrClient()和solrTemplate()都需要,努力创建具有不同URL的新语境只是获取solrClient和solrTemplate豆与第一次创建豆类覆盖。如果他们是唯一定义的Solr客户端,则每个客户端都能正常工作
总之,我怎么可以创建两个(或多个)不同的弹簧Solr的客户,每一个连接到不同的网址吗?
更多信息,回应评论...
我试图简单地重新创建具有不同configurations.Consider的SolrContext类以下内容:
@Configuration
@EnableSolrRepositories(basePackages={"foo.utilities.solr.repos.different"}, multicoreSupport=true)
public class DifferentSolrContext {
@Bean
public SolrClient solrClient() {
return new HttpSolrClient("http://SomethingDifferent:8086/solr/something");
}
@Bean
public SolrTemplate solrTemplate(SolrClient client) throws Exception {
return new SolrTemplate(client);
}
}
这里会发生什么事是,在启动期间创建bean时,@ Bean的solrClient和solrTemplate会被覆盖。
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'solrClient' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=yyySolrContext; factoryMethodName=solrClient; initMethodName=null; destroyMethodName=(inferred); defined in foo.utilities.solr.GcrSolrContext] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=xxxSolrContext; factoryMethodName=solrClient; initMethodName=null; destroyMethodName=(inferred); defined in foo.utilities.solr.XxxSolrContext]
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'solrTemplate' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=yyySolrContext; factoryMethodName=solrTemplate; initMethodName=null; destroyMethodName=(inferred); defined in foo.utilities.solr.GcrSolrContext] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=haystackSolrContext; factoryMethodName=solrTemplate; initMethodName=null; destroyMethodName=(inferred); defined in foo.utilities.solr.XxxSolrContext]
测试显示URL确实只是实例化的第一个bean。我也曾尝试重新命名第二上下文豆到别的东西,但随后Solr的功能不能定位/识别豆。
这里是试图定义多个SolrClient时抛出的错误。
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.solr.client.solrj.SolrClient' available: expected single matching bean but found 2: solrClient2,solrClient
简而言之,Spring Solr数据库中只有一个URL是可能的。 (注意:使用版本2.1.4)有没有人在Spring Solr数据下有多个URL(不只是核心)?
我已经这样做了。它不起作用,因为这些bean被第一个实例覆盖。我需要的是指向一个不同的SERVER,而不是核心。这里是来自启动日志“使用不同的定义重写bean'solrClient'的bean定义:替换...”solrTemplate bean也有类似的消息。 – Bill
它被Spring覆盖了吗? – jeorfevre
是的。请参阅添加到问题中的其他注释。 – Bill