2017-06-07 61 views
1

我与聚合来自多个源数据的应用工作。在这种情况下,我需要使用不相关的数据连接到两个不同的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(不只是核心)?

回答

2

因为有相同的弹簧范围内相同类型的多个Bean,消歧使用自动装配时是必需的。下面应该工作:

配置为第一Solr的服务器

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

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

配置为第二Solr的服务器

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

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

使用SolrTemplate小号

@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 s通过@Qualifier使用其唯一名称进行了明确注射。

更多SolrTemplate s可以通过这种方式进行初始化和注入。

示例项目可用on Github演示这一点。

0

创建另一个bean春天到Solr使用,这是很简单的清洁:

@Configuration 
@EnableSolrRepositories(basePackages={"foo.utilities.solr.repos.xxx"}, multicoreSupport=true) 
public class XXXSolrContext { 

    @Bean 
    public SolrClient getClient() { 
     return new HttpSolrClient("http://foo:8086/solr/xxx"); 
    } 

    @Bean 
    public SolrTemplate getTemplate(SolrClient client) throws Exception { 
     return new SolrTemplate(client); 
    } 
} 
+0

我已经这样做了。它不起作用,因为这些bean被第一个实例覆盖。我需要的是指向一个不同的SERVER,而不是核心。这里是来自启动日志“使用不同的定义重写bean'solrClient'的bean定义:替换...”solrTemplate bean也有类似的消息。 – Bill

+0

它被Spring覆盖了吗? – jeorfevre

+0

是的。请参阅添加到问题中的其他注释。 – Bill

相关问题