multithreading - 为什么 EventDispatcher 被阻止
问题描述
在我们的应用程序中,我在进行性能测试时看到了下面的堆栈跟踪。HTTP 调用 /content/myproduct.product-details.json 被执行多次。
"10.43.0.54 [1622796489658] GET /content/myproduct.product-details.json HTTP/1.1" #38568
prio=5 os_prio=0 cpu=1873.84ms elapsed=520.13s tid=0x00007f9d40ec3800 nid=0xe20 waiting
for monitor entry [0x00007f9d10dd7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.felix.framework.EventDispatcher.updateListener(EventDispatcher.java:397)
- waiting to lock <0x00000007143ec440> (a org.apache.felix.framework.EventDispatcher)
at org.apache.felix.framework.EventDispatcher.addListener(EventDispatcher.java:183)
at org.apache.felix.framework.Felix.addServiceListener(Felix.java:3615)
at org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:259)
at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:297)
- locked <0x00000007bce37348> (a org.osgi.util.tracker.ServiceTracker$Tracked)
- locked <0x00000007bce372a8> (a org.osgi.util.tracker.ServiceTracker)
at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:264)
at org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:160)
at org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:112)
at org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:107)
at org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:197)
at org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:145)
at org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.getBlobAccessProvider(UserConfigurationImpl.java:276)
at org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.getUserManager(UserConfigurationImpl.java:251)
at org.apache.jackrabbit.oak.security.authentication.token.TokenProviderImpl. (TokenProviderImpl.java:138)
at org.apache.jackrabbit.oak.security.authentication.token.TokenConfigurationImpl.getTokenProvider(TokenConfigurationImpl.java:162)
at org.apache.jackrabbit.oak.spi.security.authentication.token.CompositeTokenConfiguration$1.apply(CompositeTokenConfiguration.java:46)
at org.apache.jackrabbit.oak.spi.security.authentication.token.CompositeTokenConfiguration$1.apply(CompositeTokenConfiguration.java:43)
servlet (/content/myproduct.product-details.json) 试图通过在每个请求上创建服务资源解析器对象来获取产品详细信息。根据我的理解,每次我获取服务资源解析器对象时,都会执行一个资源解析器线程,在此过程中,OSGI 容器需要知道如何根据白板模式与不同的包进行通信。由于这个 HTTP 线程正在等待锁定 org.apache.felix.framework.EventDispatcher 对象。
你能告诉我我的理解是否正确吗?为什么 HTTP 线程无法获取 EventDispatcher 对象的锁?
解决方案
推荐阅读
- cordova - 无法运行 sass 任务:gulpfile.js 中缺少
- php - 什么是 PHP 中用于 Magento2 的“require_once”的替代品,以解决 Magento 商店中的 CodeSniffer 测试问题?
- wpf - WPF TreeViewItem 水平对齐
- php - 使用 CASE 查询时产生的别名问题
- javascript - 如何在不丢失格式的情况下实现 sql 的代码折叠/折叠
- intellij-idea - gradlew clean deployNodes - QUASAR 警告:Quasar Java 代理未运行
- soap - 错误:在 Sabre 发送 CreatePassengerNameRecordRS 请求时出现 ERR.SP.BUSINESS_ERROR
- c++ - 什么是 msvc_x64_x64 以及与 msvc_x64 有何不同
- c# - 如何在 C# 中隐藏打印弹出窗口?
- python - 损失在 Pytorch 中不会收敛,但在 TensorFlow 中会收敛