V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heyjude321
V2EX  ›  Java

方法不执行,没有任何报错信息,请教思路

  •  
  •   heyjude321 · 2022-03-25 18:06:33 +08:00 · 1686 次点击
    这是一个创建于 1005 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好。我遇到个棘手的问题,无从下手。 我的给微信用户发送模板消息的方法不执行,日志没有报错信息,微信公众号管理页面后台也没找到任何报错信息。 重启项目后问题消失,但过一段时间问题复现,大概有个 6 天不重启能出现一次,目前发现是在系统繁忙后会偶尔出现此问题。 初步判断是: 未成功调用发送消息的 sendTemplateMsg()方法,此方法由 @Async 标识,是异步方法,@Async 是用默认线程池配置,初步判断是线程池任务队列参数过大,导致任务积压无法完成。 尝试了自定义线程池,配置如下:

    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(8); taskExecutor.setMaxPoolSize(25); taskExecutor.setQueueCapacity(1000);//之前这里是 Inteter.max_value 。会不会是 1000 还是太大了? taskExecutor.setThreadNamePrefix("msg-thread-"); taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); taskExecutor.initialize();

    用户依旧收不到消息,且不报错。 线程信息大部分情况如下:

    Status Number of Threads : 384 Percentage Deadlock 0 0 (%) Runnable 16 4 (%) Waiting on condition 354 92 (%) Waiting on monitor 0 0 (%) Suspended 0 0 (%) Object.wait() 14 4 (%) Blocked 0 0 (%) Parked 0 0 (%)

    出现问题时的线程信息忘记导出了(当时只想快点解决生产问题而急忙重启)。

    请教大家该如何排查?

    8 条回复    2022-04-13 10:27:45 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2022-03-25 18:09:28 +08:00
    你配置一下拒绝策略, 在拒绝里打个日志. 看看是否有真的被线程池拒绝的.
    RedBeanIce
        2
    RedBeanIce  
       2022-03-26 12:55:30 +08:00 via iPhone
    注解有传递线程池进去吧,然后 async 方法里面没有错误日志吗
    awolf
        3
    awolf  
       2022-03-26 14:23:37 +08:00
    上线程池还不如上 mq 算了
    heyjude321
        4
    heyjude321  
    OP
       2022-03-26 17:24:16 +08:00
    @RedBeanIce 有指定线程池。没有错误日志。
    heyjude321
        5
    heyjude321  
    OP
       2022-03-26 17:25:31 +08:00
    @awolf 这个有考虑过。如果真的找不到原因,就尝试上 mq 。
    zhongpingjing
        6
    zhongpingjing  
       2022-03-27 19:44:04 +08:00
    重启后恢复,大概率是线程池被打满造成,可能原因之一就是线程资源没有被释放,可以看看栈信息
    heyjude321
        7
    heyjude321  
    OP
       2022-04-13 10:13:59 +08:00
    @zhongpingjing
    我查看了出现问题时的 jstack log ,我发现线程池全部都是这种 Waiting on condition ,全在等待条件,就是不释放。
    大概率是你说的这种原因。
    我猜测应该是 websocket 发送消息时,浏览器因为某种原因,导致 websocket 认为应该等待后再继续发送消息。

    ==========
    hread Name
    msg-thread2-7
    State
    Waiting on condition
    Java Stack
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at org.eclipse.jetty.util.SharedBlockingCallback$Blocker.block(SharedBlockingCallback.java:219)
    at org.eclipse.jetty.websocket.common.BlockingWriteCallback$WriteBlocker.block(BlockingWriteCallback.java:90)
    at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.blockingWrite(WebSocketRemoteEndpoint.java:107)
    at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.sendString(WebSocketRemoteEndpoint.java:385)
    at org.eclipse.jetty.websocket.jsr356.JsrBasicRemote.sendText(JsrBasicRemote.java:108)
    ....
    heyjude321
        8
    heyjude321  
    OP
       2022-04-13 10:27:45 +08:00
    找到个解决方案:
    https://www.cxyzjd.com/article/candyzh/74906202

    准备试下 getAsyncRemote()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:44 · PVG 13:44 · LAX 21:44 · JFK 00:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.