使用spring启动httpserver

个人博客原文地址:http://www.ltang.me/2015/12/01/httpserver_spring/

项目中原本使用的是基于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();
        ......
    
  1. 使用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。

猜你喜欢

转载自blog.csdn.net/devotedwife/article/details/81837098