知识点
相关文章
更多最近更新
更多tomcat线程一直处于RUNNABLE,不接受请求
2019-03-27 01:08|来源: 网路
最近项目中一个模块出现一个问题,本人做的比较浅显,所以很简单的问题一直搞了好几天,通过各种查资料、工具终于分析除了问题。问题如下:
现在对tomcat一个工程(会通过httpurlconnection去请求别的资源)并发过多时候,tomcat直接跟挂去一样,再输入任何地址都一直不响应。通过java自带的检测工具看到像http-8080-1这样的http线程全部一直处于RUNNABLE状态,正常应该请求完处于WAITING。
其实这个问题很简单,去csdn等发问,版主说是死锁了--!结果耗去我很多时间去检查、分析哪里死锁了,其实这个不是线程死锁,忍不住吐槽下,不过也有我的原因在里面。最后通过jconsole,jvisualvm分析下tomcat进程,用jstack分析了thread dump,发现只要并发超过最大线程数然后就会这样,所有http线程都是在处理此工程的请求。而真实情况是此工程需要请求另一个服务(也部署在tomcat)才能得到返回结果,这样就造成了所有线程都是在等待返回结果(因为httpurlconnection没有设置超市时间),造成另一个服务一直获得不到线程去处理,从而造成了这种情况!
附上原来的实现原理,引以为戒!
packag search; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class test extends HttpServlet { public test() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = "http://localhost:8080/solr/select/?q=name%3A%E8%B4%B5%E5%B7%9E&version=2.2&start=0&rows=10&indent=on&wt=json"; response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter printWriter = response.getWriter(); String returnStr=getInfoFromService(url); System.out.println(returnStr); printWriter.write(returnStr); printWriter.close(); } private String getInfoFromService(String url) { String resultStr = ""; try { URL destURL = new URL(url); HttpURLConnection urlConn = (HttpURLConnection) destURL .openConnection(); urlConn.setRequestMethod("GET"); urlConn.setDoOutput(true); urlConn.setDoInput(true); urlConn.setUseCaches(false); InputStreamReader inStream = new InputStreamReader(urlConn .getInputStream(), "utf-8"); resultStr = getRequestContent(inStream); inStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return resultStr; } private String getRequestContent(Reader reader) throws IOException { StringBuffer sb = null; sb = new StringBuffer(); char[] data = new char[1024]; int i = reader.read(data); while (i != -1) { sb.append(data, 0, i); i = reader.read(data); } String sreq = sb.toString(); return sreq; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } public void init() throws ServletException { } }
转自:http://www.cnblogs.com/lcxdever/p/3421267
相关问答
更多-
除了IIS和Apache,还有没有其它的服务器程序[2022-05-09]
tomcat -
您应该将json数据发送到您的服务器,尝试以下代码,在您的标头中添加'Accept': 'application/json, */*' : var edit = function(form){ var token = window.localStorage.getItem('token'); $ionicLoading.show(); return $http({ method : 'POST', url : API.url + '/user', head ...
-
首先,您的查询字符串无效。 params = "?id=test&data=testdata"; 应该是的 params = "id=test&data=testdata"; 的? 仅当您将其作为GET查询字符串连接到请求URL时才有效。 当你想把它写成POST请求体时,你不应该使用它。 说,如果这个服务不应该返回HTML(例如明文,JSON,XML,CSV等),那么使用servlet。 这是一个发出明文的例子。 String id = request.getParameter("id"); Strin ...
-
在settings.py文件中的MIDDLEWARE_CLASSES中添加以下内容 MIDDLEWARE_CLASSES =('mysite.crossdomainxhr.XsSharing') 复制此文件并将其放在与settings.py相同的级别 crossdomainxhr.py 来自django import http 尝试:从django.conf导入设置XS_SHARING_ALLOWED_ORIGINS = settings.XS_SHARING_ALLOWED_ORIGINS XS_SHAR ...
-
更改您的“测试”课程如下: final String endpoint = "http://localhost:3000/api" RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(endpoint) .build(); Service service = restAdapter.create(Service.class); service.store(faul ...
-
您还必须在连接到EC2实例的AWS安全组中打开端口9999 。 You have to also open port 9999 in the AWS Security Group attached to the EC2 instance.我最后通过更新我的控制器方法来修复它,如下所示: @RequestMapping(value = "/greeting",produces="application/json",method = RequestMethod.GET) public @ResponseBody ResponseBean greeting(@RequestParam(value="name", required=false, defaultValue="World") String name,HttpServletRespon ...这是相当不成文的。 Thread#join(long)状态的javadoc 当一个线程终止this.notifyAll方法被调用。 建议应用程序不要在Thread实例上使用wait , notify或notifyAll 。 这是专门说不要做你现在正在做的事情。 也就是说,在Thread对象上synchronized并在同一个对象上调用wait 。 synchronized (t) { System.out.println(t.getState()); t.wait(); } 在你的代码的当 ...我认为你是对的,tomcat喜欢在自己的线程中处理每个请求。 对于多个并发线程,这可能会有问题。 我有以下建议: 在server.xml中配置Connector元素的maxThreads和acceptCount属性。 通过这种方式,您可以将可以生成的线程数限制为阈值。 达到该限制后,请求将排队。 acceptCount属性用于设置此队列大小。 最简单的实施,但不是一个好的长期解决方案 在server.xml中配置多个Connector元素,并通过在server.xml中添加Executor元素使它们共享一个 ...