Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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 Apache HttpClient-内存不足问题_Java_Apache Kafka_Apache Httpclient 4.x - Fatal编程技术网

Java Apache HttpClient-内存不足问题

Java Apache HttpClient-内存不足问题,java,apache-kafka,apache-httpclient-4.x,Java,Apache Kafka,Apache Httpclient 4.x,我有一个从ApacheKafka读取消息并将数据发送到REST端点的处理器 服务器只有4个内核和4 GB ram,其中最多2GB分配给java进程 消息以4k/秒的速率生成和使用 运行几分钟后,程序内存不足 异步调用http rest端点而不等待响应的最佳方式是什么 如何管理httpClient连接?我的印象是,我需要启动客户端,而不是关闭它,这样我就可以重用连接 您是否发现以下代码有任何问题 公共类SomeProcesor实现BPProcessor{ private ThreadPoolE

我有一个从ApacheKafka读取消息并将数据发送到REST端点的处理器

服务器只有4个内核和4 GB ram,其中最多2GB分配给java进程

消息以4k/秒的速率生成和使用

运行几分钟后,程序内存不足

  • 异步调用http rest端点而不等待响应的最佳方式是什么
  • 如何管理httpClient连接?我的印象是,我需要启动客户端,而不是关闭它,这样我就可以重用连接
  • 您是否发现以下代码有任何问题
公共类SomeProcesor实现BPProcessor{

private ThreadPoolExecutor exec = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
private CompletionService<Boolean> pool = new ExecutorCompletionService<Boolean>(exec);
CloseableHttpAsyncClient httpclient = null ; 

@Override
public void begin() {
    httpclient = HttpAsyncClients.createDefault();
    RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000).setConnectTimeout(5000).setSocketTimeout(5000).build();
    HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig).build();
    // Start the client
    httpclient.start();

}

@Override
public void process(MessageAndMetadata<?, ?> mMData, List<Map> events) {

    List<Map<String, Object>> listMap = new ArrayList<>();  

    // loop and extract the data from events into the above List
    //..
    //..

    // submit to seperate thread to post to HTTP
    pool.submit(new HttpThread(listMap);
}

private class HttpThread implements Callable<Boolean> {
    List<Map<String, Object>> listMap = null;
    public HttpThread(List<Map<String, Object>> listMap) {
        this.listMap = listMap;
    }
    @Override
    public Boolean call() throws Exception {
        return postToHttp(listMap);
    }
}

private Boolean postToHttp(List<Map<String, Object>> listMap) throws UnsupportedEncodingException {
    for (Map<String, Object> map : listMap) {

        try {
            HttpPost postRequest = new HttpPost("https://myserver:8080/services/collector");
            postRequest.addHeader(HttpHeaders.ACCEPT, "application/json");
            postRequest.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
            postRequest.addHeader(HttpHeaders.CONNECTION, "keep-alive");

            StringEntity input = new StringEntity(methodToConvertMapToJSON(map));
            input.setContentType("application/json");
            postRequest.setEntity(input);

            httpclient.execute(postRequest, null);

        } catch (Exception e) {
            return false;
        } catch (Throwable th) {
            return false;
        }
    }
    return true;
}
private ThreadPoolExecutor exec=(ThreadPoolExecutor)Executors.newFixedThreadPool(4);
私有CompletionService池=新的ExecutionCompletionService(exec);
CloseableHttpAsyncClient httpclient=null;
@凌驾
公共空间开始(){
httpclient=HttpAsyncClients.createDefault();
RequestConfig RequestConfig=RequestConfig.custom().setConnectionRequestTimeout(5000).setConnectTimeout(5000).setSocketTimeout(5000).build();
HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig.build();
//启动客户端
httpclient.start();
}
@凌驾
公共作废流程(MessageAndMetadata mMData,列出事件){
List listMap=new ArrayList();
//循环并将事件中的数据提取到上面的列表中
//..
//..
//提交到单独的线程以发布到HTTP
提交(新的HttpThread(listMap);
}
私有类HttpThread实现可调用{
List listMap=null;
公共HttpThread(列表列表映射){
this.listMap=listMap;
}
@凌驾
公共布尔调用()引发异常{
返回postToHttp(listMap);
}
}
私有布尔postToHttp(列表listMap)引发不受支持的编码异常{
用于(映射:列表映射){
试一试{
HttpPostRequest=新的HttpPost(“https://myserver:8080/services/collector");
addHeader(HttpHeaders.ACCEPT,“application/json”);
addHeader(HttpHeaders.CONTENT_类型,“application/json”);
addHeader(HttpHeaders.CONNECTION,“保持活动”);
StringEntity输入=新的StringEntity(methodToConvertMapToJSON(map));
setContentType(“应用程序/json”);
setEntity(输入);
httpclient.execute(postRequest,null);
}捕获(例外e){
返回false;
}捕获(可丢弃){
返回false;
}
}
返回true;
}

}需要使用http响应或释放连接,否则连接将消耗资源。 改变


我建议启用(也许还有评测)来确定您耗尽内存的原因。我还可以将
HttpClient
移动到。processor类仅实例化一次,这就是我在begin中启动HttpClient对象的原因。为什么我们需要将其移动到对象池?而您只有一个处理器?每秒4000条消息?啊..很好。我有一个facility以增加使用者的实例数。这就是为什么您希望池中的单个HttpClient?我是否需要关闭连接?对于池,您是说--2.3.3节?您是指releaseConnection()甚至在获得响应之前?它是否会中止原始请求本身?如果我正在等待响应,它如何被认为是异步的?execute方法不会返回HttpResponse!使用.get()获取HttpResponse
httpclient.execute(postRequest, null);
HttpResponse response = httpclient.execute(postRequest, null).get();
if(response.getStatusLine().getStatusCode() != 200) {
// do something
}
// release the connection, better add to a finally clause
postRequest.releaseConnection();