首页 > 解决方案 > 在 Java HTTP Server 中运行频繁的 bash 命令的问题

问题描述

我实现了一个简单的 HTTP 服务器,一旦调用一个端点,它就会从 S3 检索一个文本文件并返回它。不幸的是,当请求很高时,例如每秒 100 次,它会进入不稳定状态并且无法响应 HTTP 请求并且它们会超时。为了访问 S3,我运行了一个 bash 命令(一个命令需要 2 秒才能执行),所以我认为可能是频繁的 bash 命令和管道效率不高。另外,我们在 Kubernetes 中运行代码,以防它也可能导致资源限制等。

问题是什么?是频繁的管道、HTTP Server API 等吗?如何解决?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class FileRetriever implements Runnable {
    HttpServer server;
    ProcessBuilder processBuilder;

    public FileRetriever() {
        processBuilder = new ProcessBuilder();
        Thread t = new Thread(this);
        t.start();
    }


    public void run() {
        try {
            server = HttpServer.create(new InetSocketAddress(serverPort), 0);
            server.createContext("/getfile", new GetFileHandler());
            server.setExecutor(null);
            server.start();
        } catch (IOException e) {
            logger.error("HttpServer ERROR", e);
        }
    }

    class GetFileHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange he) throws IOException {
            // parse request
            // http://localhost:9003/getfile?id=xxxxx
            String response = "";
            URI requestedUri = he.getRequestURI();
            String query = requestedUri.getRawQuery();

            String pair[] = query.split("=");
            String id="";
            if (pair[0].equals("id")) {
                id = pair[1];
                try {
                    String command = "aws --endpoint-url="+S3server+" s3 cp s3://file-store/"+id+"/files/"+id+".txt -";
                    processBuilder.command("sh", "-c", command+" ; true");
                    Process process = processBuilder.start();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    BufferedReader readerErrors = new BufferedReader(new InputStreamReader(process.getErrorStream()));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        response+=line+"\n";
                    }
                    if(response.trim().equals("")) {
                            response="Not Found";
                            he.sendResponseHeaders(404, response.length());
                    }
                    else {
                        logger.info("Received file successfully: " + id);
                        he.sendResponseHeaders(200, response.length());
                    }
                } catch (Exception e) {
                    response = "ERROR in GetFileHandler.";
                }
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());
            os.close();
        }
    }
}
}

标签: javabashaws-cliprocessbuilderhttpserver

解决方案


推荐阅读