异步请求tomcat异常;get请求路径内有汉字,后台获取乱码;高版本JDK运行低版本代码会报错

异步请求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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangyang_VV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值