发布于 

使用spring启动httpserver

项目中原本使用的是基于socket的server,后来因为一些原因,需要添加一个http的回调地址,供外部调用,但是总不能修改项目结构,而且只是一个接口需求,不想也不需要重新开个项目丢进服务器,所以直接使用了java自带的HttpServer类,启动一个端口作为http请求的回调地址。

  1. HttpServer代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void start() {
    try {
    server = HttpServer.create(new InetSocketAddress(port), 0);

    server.createContext("/backcall", backCallHandler);
    server.setExecutor(null);
    server.start();

    logger.info("本地监听端口启动成功({})", port);
    } catch (IOException e) {
    logger.error("本地监听端口启动失败(" + port + ")", e);
    }
    }

    public void stop() {
    if (server != null) {
    server.stop(100);
    }
    }
  2. 其中backCallHandler是对http请求的分发类,解析请求参数,再调用其它方法处理请求并返回结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class BackCallHandler implements HttpHandler, ApplicationContextAware {

    public void handle(HttpExchange httpExchange) throws IOException {
    InputStream in = httpExchange.getRequestBody(); //获得输入流
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, weiZhiUtil.ENCODING));
    String parameterStr = "";
    String temp = null;
    while ((temp = reader.readLine()) != null) {
    parameterStr += temp;
    }
    Map<String, String> parameters = null;
    try {
    parameters = getParametersMap(parameterStr);
    } catch (Exception e) {
    }
    LOGGER.info("回调接口收到请求,参数为:[" + parameterStr + "]");
    ......
    httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, resDoc.asXML().getBytes("UTF-8").length);
    OutputStream out = httpExchange.getResponseBody();
    out.write(resDoc.asXML().getBytes("UTF-8");
    out.flush();
    ......
  3. 使用spring bean配置并管理httpServer的启动:

    1
    2
    3
    <bean class="com.kuaisu.weizhi.service.WeiZhiHttpServer" init-method="start" destroy-method="stop">
    <property name="port" value="${HTTP_LOCAL_PORT}"/>
    </bean>

    spring在实例化这个对象时,就会调用start方法初始化,并注入port参数,启动httpServer。