美文网首页
quartz线程阻塞问题

quartz线程阻塞问题

作者: landon30 | 来源:发表于2018-09-14 17:55 被阅读0次

quartz blocked

现象-所有quartz的job(Hour/Minute等失去作用 无相关任何log输出)

jstack 发现:所有的quartz线程都在MinuteJob.execute#PrometheusService.pushgateway

  • 最终阻塞在SocketInputStream.socketRead0
  • 注意此时线程阻塞 但是状态是runnable
  • 因为线程就new/runnable/blocked#synchronized/waiting#Object.wait/TIMED_WAITING#sleep.../TERMINATED
  • 所以即使类似调用socket.read时 线程会挂起 但此时状态还是runnable
    "DefaultQuartzScheduler_Worker-9" #40 prio=5 os_prio=0 tid=0x00007f38ecd51800 nid=0x5a5d runnable [0x00007f38c94c8000]
       java.lang.Thread.State: RUNNABLE
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
            at java.net.SocketInputStream.read(SocketInputStream.java:170)
            at java.net.SocketInputStream.read(SocketInputStream.java:141)
            at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
            at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
            at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282)
            at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
            at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
            at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
            at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
            at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
            at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
            at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
            at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
            at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
            at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
            at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
            at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
            at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
            at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
            at com.xx.achilles.spurs.common.utils.HttpUtils.doPost(HttpUtils.java:53)
            at com.xx.achilles.spurs.gs.service.PrometheusService.pushgateway(PrometheusService.java:85)
            at com.xx.achilles.spurs.gs.service.PrometheusService.pushOnlineCount(PrometheusService.java:63)
            at com.xx.achilles.spurs.gs.quartz.MinuteJob.execute(MinuteJob.java:46)
            at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
            at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
            - locked <0x00000000805e7928> (a java.lang.Object)
    
  • debug看-push的http地址

    • 有时候是connect连接不上 直接走超时了
    • 线上的错误是connect连接上了 但是socket#read超时了 所以应该再加上一个socketTimeout
    try {
              HttpUtils.doPost(url, data, HttpConstants.CONNECT_TIMEOUT, HttpConstants.SO_TIMEOUT);
          } catch (Exception e) {
              DataLogService.getInstance().error("时实采集数据推送异常", e);
          }
    
    • Defines the socket timeout ({@code SO_TIMEOUT}) in milliseconds,which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets
    • 即connectTimeout和socketTimeout都要设置
        *  connectionRequestTimeout:
        *  从连接池中获取连接的超时时间,超过该时间未拿到可用连接,
        *  会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
        *  connectTimeout:
        *  连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
        *  socketTimeout:
        *  服务器返回数据(response)的时间,超过该时间抛出read timeout

相关文章

  • quartz线程阻塞问题

    quartz blocked 现象-所有quartz的job(Hour/Minute等失去作用 无相关任何log输...

  • NSTimer

    一.线程阻塞问题 1.主线程 (1) NSRunLoopMode : NSDefaultRunLoopMode 控...

  • iOS开发多线程--线程状态

    线程简介 线程创建 线程的开启: 线程的运行和阻塞:(1)设置线程阻塞1,阻塞2秒 (2)第二种设置线程阻塞2,以...

  • netty(四)nio之网络编程

    一、阻塞与非阻塞 1.1 阻塞 1.1.1 阻塞模式会存在哪些问题? 1)在阻塞模式下,以下的方法都会导致线程暂停...

  • 主线程阻塞问题

    问题 主线程阻塞会导致新添加在父视图的view不能及时显示。 如下代码: -(void)saveButtonAct...

  • 关于高并发的一些思考

    1.问题 1、什么是线程的交互方式? 2、如何区分线程的同步/异步,阻塞/非阻塞? 3、什么是线程安全,如何做到线...

  • iOS 多线程问题

    目录多线程简介iOS多线程NSThread解决线程阻塞问题多个线程并发线程状态扩展--NSObject分类扩展方法...

  • Java基础面试高频问答题

    1、什么导致线程阻塞 一般线程中的阻塞: Socket客户端的阻塞: Socket服务器的阻塞: 什么导致线程阻塞...

  • Android 多线程之阻塞队列

    Android 多线程系列 Android 多线程之几个基本问题 Android多线程之常见的线程形态 阻塞队列 ...

  • IJKSDLGLView fix xcode 10.2.1 Ma

    IJKPlayer首次打开阻塞主线程问题解决#4739

网友评论

      本文标题:quartz线程阻塞问题

      本文链接:https://www.haomeiwen.com/subject/ozxagftx.html