异步请求tomcat异常解释
多线程异步并发或Ajax异步请求异常报错
cannot dispatch without an AsyncContext:
[org.apache.catalina.core.AsyncListenerWrapper]
java.lang.IllegalArgumentException: Cannot dispatch without an AsyncContext
at org.springframework.util.Assert.notNull(Assert.java:198)
at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.dispatch(StandardServletAsyncWebRequest.java:131)
at org.springframework.web.context.request.async.WebAsyncManager.setConcurrentResultAndDispatch(WebAsyncManager.java:391)
at org.springframework.web.context.request.async.WebAsyncManager.lambda$startCallableProcessing$2(WebAsyncManager.java:315)
at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.lambda$onError$0(StandardServletAsyncWebRequest.java:146)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onError(StandardServletAsyncWebRequest.java:146)
at org.apache.catalina.core.AsyncListenerWrapper.fireOnError(AsyncListenerWrapper.java:49)
at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:410)
at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)
at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:242)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
因为HTTP底层包含了TCP的连接,客户端发送Jmeter方法请求会分配系统临时端口用于客户端请求处理。Jmeter 接口请求参数keep_alive需要去掉勾选不然端口不会及时释放。
这个问题可以总结为是:Spring容器异步分发工作机制客户端与服务端在连接断开时没法处理异步请求的目标servlet无法分发所致。这个问题不是程序本身业务代码报错,可以忽略。
有关get请求路径内有汉字,到后台自动转码不通过
本地idea有时候自动会转码,在后台获取到对应的汉字,然后进行查询,但是线上就不行,有可能idea配置了编码格式导致的,所以需要进行转码处理。
以下是线上解决方案:
1.先获取字符串参数:
String str=request.getParameter(“XXXX”,String.class);
2.此步是告诉JVM将中文以“ISO-8859-1”的编码方式转换为字节数组。
byte[] bytes=str.getBytes(“ISO-8859-1”);
3.告诉JVM将字节数组中的字节以“UTF-8”的编码方式组成字符串s。
String s=new String(bytes,“UTF-8”);
4.一步写成为:
String s=new String(str.getBytes(“ISO-8859-1”),“UTF-8”);
5.然后再使用s去进行逻辑处理即可。
高版本JDK运行低版本代码会报错
我这里遇到了一个问题,首先编译环境是8的jdk,本机运行没有任何问题,打完包需要放到服务器上,放上去之后就出现运行失败,一开始不知道什么问题,后来发现线上用的11jdk,虽说JDK向下兼容,但是运行还是失败的,之后改了回了就好了,这里具体的报错就没记录,这里记一下,如果高版本运行低版本JDK编译的代码报错,请调整为一致的JDK环境。
报错的就放一个常见的吧:
五⽉22, 20197:05:35上午 org.apache.tomcat.util.modeler.BaseModelMBean invoke
严重: Exception invoking method createStandardContext
javax.management.RuntimeOperationsException: Exception invoking method manageApp
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:305)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:598)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:547)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498