OSGi を使用している比較的大量/要求の多いシステムがあります。1 日あたり 8 億件近くのリクエストが寄せられています。
現在、スレッドがブロックされるという問題がいくつか見られます。受信するすべてのリクエストに対して、registerService を使用してイベント/データを osgi バンドルに転送し、このサービスをリッスンしている OSGi バンドルにペイロード/データを渡します。
次のように: bundleContext.registerService(Map.class.getName(), dataHolderMap, null);
dataHolderMap は通常の Java ハッシュマップに他なりません
JStack を使用したスレッドダンプは次のとおりです。
================================================== =========================
"RequestThread" prio=10 tid=0x00000000421ab800 nid=0x1042 実行可能 [0x00007fbdd3867000] java.lang.Thread.State: org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:295) で実行可能 - ロック済み <0x0000000700e2c5c500> org.apache.felix.framework.ServiceRegistry) の org.apache.felix.framework.Felix.getService(Felix.java:3568) の org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468) のorg.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932) at org.osgi.util.tracker.ServiceTracker$ Tracked.customizerAdding(ServiceTracker.java:864) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) で org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894) で org.apache.felix.framework .util.EventDispatcher.invokeServiceListenerCallback(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) org.apache.felix. org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) com.mypackage.person.bs.processor.Processor.sendEvent(Processor.java:56) で com.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) で com.mypackage.jetMyStream .event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.onMessage(InboundMessagingChannel.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)
"RequestThread" prio=10 tid=0x00000000425f8800 nid=0x1041 モニター エントリを待機中 [0x00007fbdd3968000] java.lang.Thread.State: org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java: 109) - org.apache.felix.framework.Felix.registerService(Felix.java:3393) で org.apache.felix.framework.BundleContextImpl で <0x0000000700e2c590> (org.apache.felix.framework.ServiceRegistry) をロックするのを待っています.registerService(BundleContextImpl.java:346) で org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) で com.mypackage.person.bs.processor.Processor.sendEvent(BullseyeModelProcessor.java:56) でcom.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) で com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.onMessage(InboundMessagingChannel.java:204) で.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)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)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) で
これに関するいくつかの質問:
registerService を介してマップを送信する際に何か問題がありますか? もしそうなら、私の代替手段は何ですか?
これを機能させる方法についてのアイデアはありますか? 26 個のノードがあり、このメカニズムを使用して毎秒約 400 のリクエストを処理するだけで済みます
誰かが同様の問題を抱えていましたか?どんなポインタでも大歓迎です
ありがとうマスティ