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>