由ServiceRegistry阻止的线程

Mas*_*sti 1 osgi osgi-fragment osgi-bundle

我有一个相对较高的音量/请求系统,我们正在使用OSGi.我们每天接近800M请求.

我们目前看到线程被阻止的一些问题.对于每个进入的请求,我们使用registerService将事件/数据转发到osgi包,以将有效负载/数据传递给正在侦听此服务的OSGi包.

像这样:bundleContext.registerService(Map.class.getName(),dataHolderMap,null);

dataHolderMap只是一个普通的java hashmap

这是使用JStack的threaddump:

================================================== =========================

"RequestThread" PRIO = 10 TID = 0x00000000421ab800 NID = 0x1042可运行的[0x00007fbdd3867000] java.lang.Thread.State中:在RUNNABLE org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:295) - 锁定<0x0000000700e2c590>(位于org.apache.felix.framework.Felix.getService(Felix.java:3568)的org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468)at org.apache.felix.framework.ServiceRegistry)位于org.osgi.util.tracker.ServiceTracker的org.osgi.util.tracker.ServiceTracker $ Tracked.customizerAdding(ServiceTracker.java:932)的org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411) Tracked.customizerAdding(ServiceTracker.java:864)org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)atg.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)org oros.apache.felix.framework.util.EventDispatcher.invokeServiceListe中的.osgi.util.tracker.ServiceTracker $ Tracked.serviceChanged(ServiceTracker.java:894)nerCallback(EventDispatcher.java:932)在org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)在org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543) org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4419)org.apache.felix.framework.Felix.registerService(Felix.java:3423)at org.apache.felix.framework.BundleContextImpl.registerService (BundleContextImpl.java:346)位于com的com.mypackage.person.bs.processor.Processor.sendEvent(Processor.java:56)的org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320). mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent在com.mypackage.jetMyStream.event(AbstractEventSource.java:97)在com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113). com.mypackage.jetMyS上的channel.messaging.InboundMessagingChannel.onMessage(InboundMessagingChannel.java:204)tream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349)在com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259)在com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java: 40)at com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

"RequestThread"prio = 10 tid = 0x00000000425f8800 nid = 0x1041正在等待监视器条目[0x00007fbdd3968000] java.lang.Thread.State:BLOCKED(在对象监视器上)org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java: 109) - 等待在org.apache.felix.framework.BundleContextImpl的org.apache.felix.framework.Felix.registerService(Felix.java:3393)上锁定<0x0000000700e2c590>(一个org.apache.felix.framework.ServiceRegistry)位于org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320)的.registerService(BundleContextImpl.java:346)位于com.mypackage.person.bs.processor.Processor.sendEvent(BullseyeModelProcessor.java:56)at at com.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent在com.mypackage.jetMyStream(AbstractEventSource.java:97)在com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113). event.channel.messaging.InboundMessagingChannel.onMessage(InboundMessag ingChannel.java:204)在com.mypackage.jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349)在com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259)在com.mypackage.jetMyStream .messaging.MessageServiceRequest.execute(MessageServiceRequest.java:40)

在com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

有几个问题:

  1. 我在通过registerService发送地图时做错了什么.如果是这样,我有什么选择?

  2. 关于如何让这个工作的任何想法?我们有26个节点,需要使用这种机制每秒处理大约400个请求

    有人有类似的问题吗?任何指针都非常感谢

谢谢马斯蒂

Nei*_*ett 6

"我在通过registerService发送地图时做错了.如果是这样,我的替代方案是什么?"

是!服务注册表不打算以这种方式使用; 它不是消息传送总线.

至于替代方案......为什么不使用消息传送总线?您可以查看OSGi Event Admin,但这个想法有很多其他实现.

"关于如何使其工作的任何想法?我们有26个节点,并且只需要使用这种机制每秒处理大约400个请求"

您必须更加具体地了解您要实现的目标.这个问题太抽象了.请描述消息的来源,需要交付的地方,中间需要进行的处理(如果有的话)等.