Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使在传递套接字超时参数后,SolrClient也不会超时_Java_Solr - Fatal编程技术网

Java 即使在传递套接字超时参数后,SolrClient也不会超时

Java 即使在传递套接字超时参数后,SolrClient也不会超时,java,solr,Java,Solr,我的SolrClient实现是用java编写的。我一直在测试我的服务和solr_6.6.0上的负载,即使在提到超时参数后,它似乎也没有超时(因为总solr时间的日志消息在splunk中可见,总时间为158秒)。我相信这会导致其他请求出现502(我有几个服务运行实例),solr所花费的时间急剧增加。我还运行了几个solr的复制实例 CloudSolrClient 6.5.1: public class SolrClientWrapper { private static final Logger

我的SolrClient实现是用java编写的。我一直在测试我的服务和solr_6.6.0上的负载,即使在提到超时参数后,它似乎也没有超时(因为总solr时间的日志消息在splunk中可见,总时间为158秒)。我相信这会导致其他请求出现502(我有几个服务运行实例),solr所花费的时间急剧增加。我还运行了几个solr的复制实例

CloudSolrClient 6.5.1:

public class SolrClientWrapper {

private static final Logger LOGGER = LoggerFactory.getLogger(SolrClientWrapper.class);
private final CloudSolrClient solrClient;
private PoolingHttpClientConnectionManager connMgr;


public SolrClientWrapper(List<String> solrZkHosts, Integer maxConnPerRoute,
                         Integer connectTimeoutInSeconds, Integer connectionRequestTimeoutInSeconds,
                         Integer socketTimeoutInSeconds, Integer httpClientMaxConn) {

    RequestConfig requestConfig = RequestConfig.custom()
                                               .setConnectTimeout(connectTimeoutInSeconds.intValue() * 1000)
                                               .setConnectionRequestTimeout(connectionRequestTimeoutInSeconds.intValue() * 1000)
                                               .setSocketTimeout(socketTimeoutInSeconds.intValue() * 1000)
                                               .build();

    connMgr = new PoolingHttpClientConnectionManager();
    connMgr.setDefaultMaxPerRoute(maxConnPerRoute.intValue());
    connMgr.setMaxTotal(httpClientMaxConn.intValue());

    HttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig)
                                                .setConnectionManager(connMgr)
                                                .build();

    solrClient = new CloudSolrClient.Builder()
            .withZkHost(solrZkHosts)
            .withHttpClient(httpClient)
            .build();
}


public QueryResponse query(SolrQuery query, String collection) throws SolrClientException {
    try {
        
        LOGGER.debug("Making a Solr request for collection={}, query={}: ", collection,query.toString());
        QueryResponse response = solrClient.query(collection, query, SolrRequest.METHOD.POST);
        LOGGER.info("Response for collection={} and query={} with status={}, timeToExecuteTheQuery={}, totalTimeTaken={}",
                collection,query,response.getStatus(),response.getQTime(), response.getElapsedTime());

        return response;
    } catch (Exception se) {
        LOGGER.error("Exception: Query to solr collection failed with exception. collection={} message={}",
                                   collection, se.getMessage(), se);
        LOGGER.info("atException connectionPoolStats={}",connMgr.getTotalStats());
        throw new SolrClientException(se.getMessage(), se);
    }
}

setSocketTimeout
调整数据包之间的等待时间,而不是保持套接字打开的总时间
connectionRequestTimeout
是“从连接管理器请求连接时使用的超时(以毫秒为单位)。”。因此,您设置的两个选项都不表示“请求的总时间”。我认为您必须找到一种改变的方法,或者将其包装在一个单独的线程/警报中,您可以超时。“SocketTimeout调整数据包之间的等待时间”:您的意思是,如果不是等待服务器回复(solr)的时间,而是等待其他请求数据包发送到服务器(solr)的时间这是任何数据到达之间的时间;因此,如果是更大的结果集或来自服务器的任何响应,则会重置计时。当结果在某些输出格式下可用时,Solr将对其结果集进行流式处理。您应该能够使用wireshark或tcpdump为其提供服务器
  max-limit: 500
  http-client-connection-request-timeout-in-seconds: 20
  http-client-connect-timeout-in-seconds: 5
  http-client-socket-timeout-in-seconds: 20
  http-client-max-conn-per-route: 50
  http-client-max-conn: 600