gpt4 book ai didi

Spring Solr - 使用多个客户端来提供不同的服务

转载 作者:行者123 更新时间:2023-12-02 05:35:38 25 4
gpt4 key购买 nike

我正在使用一个聚合来自多个来源的数据的应用程序。在本例中,我需要连接到两个具有不相关数据的不同 Solr 服务。为此我建立了两个不同的数据存储库。我将 bean 定义如下:

@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() Bean,因此尝试使用不同的 URL 创建新的 Context 只会让 solrClient 和 solrTemplate bean 被首先创建的 bean 覆盖。如果每个客户端是唯一定义的 Solr 客户端,则它们可以正常工作。

简而言之,如何创建两个(或更多)不同的 Spring Solr 客户端,每个客户端连接到不同的 URL?

其他信息是对评论的回复...

我尝试简单地使用不同的配置重新创建 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。我还尝试将第二个上下文 bean 重命名为其他名称,但 Solr 功能无法定位/识别这些 bean。

这是尝试定义多个 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(不仅仅是核心)?

最佳答案

由于在同一个 Spring 上下文中存在多个相同类型的 bean,因此在使用 Autowiring 时需要消除歧义。以下内容应该有效:

Configuration for first Solr server

@Configuration
public class PrimarySolrContext {
@Bean
public SolrClient primarySolrClient() {
return new HttpSolrClient(...);
}

@Bean("primary")
public SolrTemplate solrTemplate() {
return new SolrTemplate(primarySolrClient());
}
}

Configuration for second Solr server

@Configuration
public class SecondarySolrContext {
@Bean
public SolrClient secondarySolrClient() {
return new HttpSolrClient(...);
}

@Bean("secondary")
public SolrTemplate solrTemplate() {
return new SolrTemplate(secondarySolrClient());
}
}

Using the SolrTemplates

@Service
public class SearchService {
@Autowired
@Qualifier("primary")
private SolrTemplate primarySolrTemplate;

@Autowired
@Qualifier("secondary")
private SolrTemplate secondarySolrTemplate;
}

这之所以有效,是因为:

  1. 第一个 SolrTemplate 通过明确的方法调用 (primarySolrClient()) 直接引用其 SolrClient
  2. 第二个 SolrTemplate 通过明确的方法调用 (secondarySolrClient()) 直接引用其 SolrClient
  3. 第一个 SolrTemplate 被明确命名 (@Bean("primary"))。
  4. 第二个 SolrTemplate 也有明确的命名 (@Bean("secondary"))。
  5. SolrTemplate 通过 @Qualifier 使用其唯一名称明确注入(inject)。

可以通过这种方式初始化和注入(inject)更多 SolrTemplate

示例项目可用 on Github证明了这一点。

关于Spring Solr - 使用多个客户端来提供不同的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44423675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com