从Spring Web Services连接到SOLR服务器时获取IOException

时间:2014-10-24 19:10:50

标签: java xml spring solr lucene

我一直在努力寻找这个问题的解决方案,我试图在这里解释一下。非常感谢我可以尝试的一些想法,以解决这个问题。

我们将Spring Web Services与Microsoft SQL Server作为后端。我们一直致力于SQL到SOLR迁移项目,我们需要将所有SQL数据索引到SOLR并在那里执行搜索,因为我们的应用程序一直面临很多性能问题。

我们采取的基本方法如下:

1)按照提到的HERE

创建了SOLR EAR

2)在DEV env中的IBM Websphere v7.0上部署SOLR EAR

3)在LOCAL

中的Websphere服务器上部署Spring Web Services EAR

4)以下是我们如何尝试从Web服务访问核心。这里,我展示了一个内核的示例,而在实际代码中,我们以相同的方式访问多个内核。

spring.xml

<solr:repositories base-package="com.example.solr.repository"/>

<solr:solr-server id="collection1" url="http://<hostname>:<port>/solr/collection1/"/>

<bean id="solrTemplateCollection1" class="org.springframework.data.solr.core.SolrTemplate">
            <constructor-arg index="0" ref="collection1"/>
</bean>

SearchEngineRepositoryImpl.java

package com.example.solr.repository;

import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.geo.Circle;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.FacetOptions;
import org.springframework.data.solr.core.query.SimpleFacetQuery;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.FacetEntry;
import org.springframework.data.solr.core.query.result.FacetPage;
import org.springframework.stereotype.Repository;

@Repository
public class SearchEngineRepositoryImpl implements SearchEngineRepository{
  
  @Resource
  private SolrTemplate solrTemplateCollection1;
  
  public List<SearchDocument> search(SearchCriteria searchCriteria){
    
    Criteria solrSearchCriteira  = new Criteria("name").contains(searchCriteria.getName());
    
    SimpleFacetQuery searchQuery = new SimpleFacetQuery(solrSearchCriteira);
    
    FacetPage<SearchDocument> results =  solrTemplateCollection1.queryForFacetPage(searchQuery,SearchDocument.class);
    
    // rest of code
    .
    .
    .
  }
}

当我尝试运行Web服务时,我遇到以下异常:

UUID: 4b5f05b1-23ce-4b80-b6cb-bfef6d1e5abd Cause: org.springframework.data.solr.UncategorizedSolrException: IOException occured when talking to server at: http://<host>:<port>/solr/collection1; nested exception is org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://<host>:<port>/solr/collection1
	at org.springframework.data.solr.core.SolrTemplate.execute(SolrTemplate.java:122)
    at org.springframework.data.solr.core.SolrTemplate.query(SolrTemplate.java:332)
	at org.springframework.data.solr.core.SolrTemplate.queryForFacetPage(SolrTemplate.java:286)
	at com.example.solr.repository.SearchEngineRepositoryImpl.search(SearchEngineRepositoryImpl.java:105)
	at com.example.solr.service.SearchServiceImpl.search(SearchServiceImpl.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
	at java.lang.reflect.Method.invoke(Method.java:611)
	at org.springframework.ws.server.endpoint.MethodEndpoint.invoke(MethodEndpoint.java:134)
	at org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter.invokeInternal(DefaultMethodEndpointAdapter.java:240)
	at org.springframework.ws.server.endpoint.adapter.AbstractMethodEndpointAdapter.invoke(AbstractMethodEndpointAdapter.java:53)
	at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:233)
	at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:173)
	at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88)
	at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:59)
	at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:292)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
	at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:960)
	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1064)
	at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
	at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:909)
	at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
	at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
	at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
	at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
	at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
	at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
	at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
	at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
	at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
	at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
	at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)

Caused by: org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://<host>:<port>/solr/collection1
	at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:413)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:180)
	at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:90)
	at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
	at org.springframework.data.solr.core.SolrTemplate$11.doInSolr(SolrTemplate.java:339)
	at org.springframework.data.solr.core.SolrTemplate$11.doInSolr(SolrTemplate.java:336)
	at org.springframework.data.solr.core.SolrTemplate.execute(SolrTemplate.java:118)
	... 53 more

Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to host:port timed out
	at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:129)
	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
	at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:352)
	... 59 more

我可以在浏览器中调用SOLR控制台和其他SOLR查询。

此外,当我在同一个Websphere服务器上部署Web服务和SOLR EAR时(即在spring.xml中将主机名更改为localhost后),我得到了正确的响应。

SOLR EAR的web.xml中没有身份验证设置。

的web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5"
         metadata-complete="true"
>
  <filter>
    <filter-name>SolrRequestFilter</filter-name>
    <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>SolrRequestFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
	
	
  <servlet>
    <servlet-name>Zookeeper</servlet-name>
    <servlet-class>org.apache.solr.servlet.ZookeeperInfoServlet</servlet-class>
  </servlet>
  
  <servlet>
    <servlet-name>LoadAdminUI</servlet-name>
    <servlet-class>org.apache.solr.servlet.LoadAdminUiServlet</servlet-class>
  </servlet>
  
  <servlet>
    <servlet-name>RedirectOldAdminUI</servlet-name>
    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
    <init-param>
      <param-name>destination</param-name>
      <param-value>${context}/#/</param-value>
    </init-param>
  </servlet>
  
  <servlet>
    <servlet-name>RedirectOldZookeeper</servlet-name>
    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
    <init-param>
      <param-name>destination</param-name>
      <param-value>${context}/zookeeper</param-value>
    </init-param>
  </servlet>
  
  <servlet>
    <servlet-name>RedirectLogging</servlet-name>
    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
    <init-param>
      <param-name>destination</param-name>
      <param-value>${context}/#/~logging</param-value>
    </init-param>
  </servlet>

  <servlet>
    <servlet-name>SolrRestApi</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
      <param-name>org.restlet.application</param-name>
      <param-value>org.apache.solr.rest.SolrRestApi</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>RedirectOldAdminUI</servlet-name>
    <url-pattern>/admin/</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectOldAdminUI</servlet-name>
    <url-pattern>/admin</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectOldZookeeper</servlet-name>
    <url-pattern>/zookeeper.jsp</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RedirectLogging</servlet-name>
    <url-pattern>/logging</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>Zookeeper</servlet-name>
    <url-pattern>/zookeeper</url-pattern>
  </servlet-mapping>
  
  <servlet-mapping>
    <servlet-name>LoadAdminUI</servlet-name>
    <url-pattern>/admin.html</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>SolrRestApi</servlet-name>
    <url-pattern>/schema/*</url-pattern>
  </servlet-mapping>
  
  <mime-mapping>
    <extension>.xsl</extension>
    <mime-type>application/xslt+xml</mime-type>
  </mime-mapping>

  <welcome-file-list>
    <welcome-file>admin.html</welcome-file>
  </welcome-file-list>

</web-app>

提供有关SOLR设置的其他信息以供参考:

SOLR首页位置:: /的Websphere /应用服务器/简档/ AppServer01 / solr的

SOLR核心位置:: /的Websphere /应用服务器/简档/ AppServer01 / solr的/ collection1

solr.xml

<?xml version="1.0" encoding="UTF-8" ?>

<solr persistent="false">

  <cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}" defaultCoreName="collection1">
    <core name="collection1" instanceDir="collection1" />
    
    <shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
      <str name="urlScheme">${urlScheme:}</str>
    </shardHandlerFactory>
  </cores>
        
</solr>

1 个答案:

答案 0 :(得分:0)

实际值还是您替换了它们?如果它们是实际值,则异常似乎表明您的变量替换不起作用。

否则,我会在网络层面对此进行故障排除以确定基本事实。在服务器上运行Wireshark或在混杂模式下运行同一网络上的任何计算机,并查看实际联系的网络地址以及真正的错误。