Servlet3是Tomcat7出现的新特性,所以需要先安装tomcat7
微信企业号使用回调模式时:
假如企业无法保证在五秒内处理并回复,可以直接回复空串,企业号不会对此作任何处理,并且不会发起重试。这种情况下,可以使用发消息接口进行异步回复。
在web.xml中的servlet节点配置:
<async-supported>true</async-supported>
代码
AsyncServlet.java
package testAsyncServlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AsyncServlet extends HttpServlet{private static final long serialVersionUID = 1L;@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("下订单开始: " + new Date() + "<br/>");out.flush();AsyncContext ctx = request.startAsync();//异步去执行开通订单new Thread(new CheckOrder(ctx)).start();out.println("订购成功: " + new Date()+ "<br/>");out.flush();} }
package testAsyncServlet;import java.io.PrintWriter;
import java.util.Date;import javax.servlet.AsyncContext;public class CheckOrder implements Runnable {private AsyncContext ctx = null;public CheckOrder(AsyncContext ctx) {this.ctx = ctx;}public void run() {try {// 模拟开通等待Thread.sleep(10000);PrintWriter out = ctx.getResponse().getWriter();out.println("已经有权限了,let's go! : " + new Date());out.flush();ctx.complete();} catch (Exception e) {e.printStackTrace();}}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>testAsyncServlet</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>asyncServle</servlet-name><servlet-class>testAsyncServlet.AsyncServlet</servlet-class><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>asyncServle</servlet-name><url-pattern>/asyncServlet</url-pattern></servlet-mapping></web-app>