Skip to content

WxMpServiceImpl.executeInternal 方法阻塞导致服务器宕机的问题 #23

Closed
@wesleywu

Description

@wesleywu

目前方法的签名是这样的:

protected synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException {...}

里边执行了一个超耗时的https的阻塞请求,直到微信官方网站返回了执行结果,才会结束这个方法。

所以,如果有多个线程通知执行 execute (然后 executeInternal),比如通过16个线程同时发送100万个模板消息,早晚都一定会发生一大堆线程阻塞在这个方法的起始处。

我们就遇到了这个情况,用 jstack 查看我们的 jvm 的线程状况,大部分都这样:
"http-nio-8081-exec-188" #1201 daemon prio=5 os_prio=0 tid=0x00007f99f0498000 nid=0x4822 waiting for monitor entry [0x00007f99c6ef4000]
java.lang.Thread.State: BLOCKED (on object monitor)
at me.chanjar.weixin.mp.api.WxMpServiceImpl.executeInternal(WxMpServiceImpl.java:729)
- waiting to lock <0x00000000c7332ed8> (a me.chanjar.weixin.mp.api.impl.WxMpServiceImpl)
at me.chanjar.weixin.mp.api.WxMpServiceImpl.execute(WxMpServiceImpl.java:705)

于是,整个jvm的线程数量耗尽,导致tomcat假死,服务器资源消耗基本为0。

所以我的问题如下:
1、这里的这个 synchronized 关键字为什么一定要加?
2、可以去掉不?
3、如果去掉,会导致什么严重问题?

感谢。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions