首页 > 解决方案 > 为什么 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 对象的锁?

标签: multithreadingosgiaem

解决方案


推荐阅读