<filter> <filter-name>AsynServlete</filter-name> <filter-class>com.kad.app.action.AsynServletT</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>AsynServlete</filter-name> <url-pattern>/</url-pattern> </filter-mapping>
http://localhost:8080/AppService/asyncServlet/testAsyn?
用上邊地址請求, 爆錯,
嚴重: Servlet.service() for servlet [applicationContext] in context with path [/AppService] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.FilterChain]: Specified class is an interface] with root cause org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.FilterChain]: Specified class is an interface at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:99) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:778) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:371)
奇怪了這個異步以前用着很正常的, 就因為我注釋了一下再 打開, 出了問題......這個問題磨蹭到下午..............
起先是部署到resin 里邊,程序爆錯. 中間擔心resin 的支持servlet 3.0 跟tomcat 有區別. 我想換成另一種不在web.xml filter 的方式,
com.kad.app.action.AsynServlet 這個是項目內接受異步請求的類
<filter> <filter-name>AsynServlete</filter-name> <filter-class>com.kad.app.action.AsynServlet</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>AsynServlete</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
還得把servlet 下加上
<servlet>
<servlet-name>applicationContext</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-common.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
下邊
/*package com.kad.app.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.AsyncContext; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.google.common.eventbus.Subscribe; import com.google.gson.Gson; import com.kad.app.action.eventregservice.MessageEventReg; import com.kad.app.redis.impl.RedisImpl; import com.kad.dev.manage.DevNoOne; import com.kad.guavaevents.messge.RTUnLockMessage; import com.kad.netty.service.kdNettyServer; @Controller @RequestMapping("/asyncServlet") public class AsynServlet implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @RequestMapping(value="/testAsyn") @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); // System.out.println("start"); PrintWriter out = response.getWriter(); AsyncContext asyncContext = request.startAsync(); asyncContext.setTimeout(5000); asyncContext.addListener(new MyAsyncListener()); Work work=new Work(asyncContext,request); new Thread(work).start(); response = asyncContext.getResponse(); // PrintWriter out1 = response.getWriter(); out.print("異步執行中"); } @Override public void destroy() { } class Work implements Runnable { private AsyncContext asyncContext; private ServletRequest request; public Work(AsyncContext asyncContext,ServletRequest request) { this.asyncContext = asyncContext; this.request = request; // EventBusCenter.register(this); } @Override public void run() { ServletResponse response = asyncContext.getResponse(); PrintWriter out; try { out = response.getWriter(); out.println("后台線程執行完成"); out.close(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } String devid =request.getParameter("devid"); // PrintWriter out = response.getWriter(); boolean sign=false; DevNoOne dev= DevNoOne.devone; RedisImpl redis =new RedisImpl(); while(true){ try { // out.println("后台線程執行完成"); Thread.sleep(100); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } String mess=null; mess= redis.get(devid); if(mess!=null) { if(request.getAsyncContext() != null && asyncContext.getTimeout()>0){ // try { ServletResponse response = asyncContext.getResponse(); PrintWriter out = response.getWriter(); out.println("后台線程執行完成"); out.close(); // } catch (IOException e) { // e.printStackTrace(); // } asyncContext.complete(); break; } } } } } } */
這種似乎是一種土方子.... 中間還必須加
一下是第二種方式 簡單明了,繼承 extends HttpServlet ,重寫doGet 或doPost 也就是你用get方法請求就重寫doget ,用post 就重寫dopost
下邊程序異步work類里邊邏輯沒寫好,不影響測試.最后的報錯跟異步無關.先寫上來.調試過程中間有個報錯 用post方式請求. 半道出家基礎不牢靠啊...
Status 405 - HTTP method POST is not supported by this URL
這是指重寫了doget 沒重寫dopost導致......
package com.kad.app.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; @WebServlet(asyncSupported=true,urlPatterns="/asyncweb") public class AsynWebServlet extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; /* @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); System.out.println("start"); PrintWriter out = response.getWriter(); AsyncContext asyncContext = request.startAsync(); asyncContext.setTimeout(500000); asyncContext.addListener(new MyAsyncListener()); Work work=new Work(asyncContext,request); new Thread(work).start(); out.print("異步執行中"); }*/ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("start"); PrintWriter out = response.getWriter(); AsyncContext asyncContext = request.startAsync(); asyncContext.setTimeout(500000); asyncContext.addListener(new MyAsyncListener()); Work work=new Work(asyncContext,request); new Thread(work).start(); out.print("異步執行中"); } class Work implements Runnable { private AsyncContext asyncContext; private ServletRequest request; public Work(AsyncContext asyncContext,ServletRequest request) { this.asyncContext = asyncContext; this.request = request; } @Override public void run() { if(request.getAsyncContext() != null && asyncContext.getTimeout()>0){ try { ServletResponse response = asyncContext.getResponse(); PrintWriter out = response.getWriter(); out.println("后台線程執行完成"); out.close(); } catch (IOException e) { e.printStackTrace(); } asyncContext.complete(); } } } }
周日傳到服務器上
出現了500 錯誤,
HTTP Status 500 – Internal Server Error Type Exception Report Message Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:622) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal
服務器內部錯誤, 最終是因為 本地測試用的數據庫的表名與線上的表名名字大小寫存在不同...linux 對大小寫很敏感....