使用spring启动httpserver
项目中原本使用的是基于socket的server,后来因为一些原因,需要添加一个http的回调地址,供外部调用,但是总不能修改项目结构,而且只是一个接口需求,不想也不需要重新开个项目丢进服务器,所以直接使用了java自带的HttpServer类,启动一个端口作为http请求的回调地址。
HttpServer代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public 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);
}
}其中backCallHandler是对http请求的分发类,解析请求参数,再调用其它方法处理请求并返回结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public 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();
......使用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。