java发送http请求,无需等待返回结果

与B项目进行交互,由于B项目一些原因,请求处理缓慢.A项目等待返回结果需要很久...
现只需发送数据无需判断发送成功失败与否,求教如何操作???
以下是发送get请求的代码

    public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 请求方式设置 POST
            connection.setRequestMethod("GET");
            // 设置维持长连接
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 设置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");
            // 开始连接请求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("连接成功,传送数据...");
                InputStream is = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                String strRead = null;
                while ((strRead = reader.readLine()) != null) {
                    sbf.append(strRead);
                    sbf.append("\r\n");
                }
                reader.close();
                result = sbf.toString();
                if (result.equals("1")) {
                    return "1";
                } else if(result.equals("0")) {
                    return "0";
                } else {
                    return result;
                }
            } else {
                System.out.println("连接失败,错误代码:"+connection.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
阅读 16.1k
4 个回答

如果是使用spring,可以使用@Async来做异步。
如果不是可以自定义线程池,把发送请求的任务execute提交到线程池中进行处理。


如果后面还想获得该http请求的返回值,请使用submit提交任务,会返回一个Future,future.get()会阻塞至直到获得该任务的结果。

HttpURLConnection 有个 setReadTimeout 的方法可以实现你的需求。

public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        HttpURLConnection connection = null;
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 请求方式设置 POST
            connection.setRequestMethod("GET");
            // 设置维持长连接
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 设置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");

            //根据需求设置读超时的时间
            connection.setReadTimeout(50);
            // 开始连接请求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("连接成功,传送数据...");
                InputStream is = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                String strRead = null;
                while ((strRead = reader.readLine()) != null) {
                    sbf.append(strRead);
                    sbf.append("\r\n");
                }
                reader.close();
                result = sbf.toString();
                if (result.equals("1")) {
                    return "1";
                } else if(result.equals("0")) {
                    return "0";
                } else {
                    return result;
                }
            } else {
                System.out.println("连接失败,错误代码:" + connection.getResponseCode());
            }
        } catch (Exception e) {
            if(e instanceof SocketTimeoutException) {
                if("Read timed out".equals(e.getMessage()) && connection != null && connection.getDoOutput()) {
                    //TODO 只请求不需要响应
                    return null;
                }
            }
            e.printStackTrace();
        }
        return null;
    }
 public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 请求方式设置 POST
            connection.setRequestMethod("POST");
            // 设置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");
            // 开始连接请求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("连接成功,传送数据...");
               
            } else {
                System.out.println("连接失败,错误代码:"+connection.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题