この質問はBounty!この問題を解決する最初の答えが勝ちます。OSGI CXFシングルトンクラスローディングの問題
私は最近、OSGIのバンドルが100%分離されていないことを発見しました。特に、バンドルがシングルトンを持つ共通バンドルを共有する場合、2つの無関係なバンドルがシングルトンを上書きする可能性があります。この問題は、CXFライブラリで明らかになりました。
私たちはバンドルA、B、および共有バンドルCXFをすべてFuseESB ServiceMix(osgiプラットフォーム)に持っています。 CXFのBusクラスはシングルトンであり、OSGIがバンドルごとに単一のクラスローダーを持つために、CXFを使用するバンドルごとにこのシングルトンを共有します。だから、私はバンドルAとバンドルBのために異なるバスを作ることができないようです。バンドルAはSSLを使用し、バンドルBはSSLを使用すべきではないので、私は重要です。バンドルAとバンドルBが同じServiceMix上に一緒にデプロイされなければならないという点で、バンドルAとバンドルBはお互いに何の関係もないということを考えると、これはさらに難解です。
今私は今この問題にいましたが(1〜2ヶ月)、私はさまざまな解決策をたくさん読んできました。しかし問題は、多くのソリューションでは、ソースコードを完全に制御する必要があります。この場合、私はそうしません。私が作成しているバンドルAは、CXFを使用するXenaraと呼ばれる、独自のサードパーティの非osgiライブラリを使用しています。私のコントロールの範囲を超えてビジネス上の理由から、私はこのサードパーティのライブラリを使用する必要があります。幸いにも、私はこのライブラリが使用するCXF Spring Beanファイルにアクセスできます。
私はこの問題を解決するために、バンドルAがCXFの独自のインスタンスを使用できるようにするか、少なくとも他のバンドルと共有されないCXFバスをインスタンス化できるようにする必要があると考えています。
私は、バンドルAにCXFを埋め込まれたが、残念ながらクラスローダは、クラスパスに探しての代わりに、バンドルAの外側からCXFを取得保管:ここに私が試したかと考えられてきた方法があります。バンドルAの外で検索する前にバンドルAのCXFを最初に検索する方法を決して考えませんでした。
バンドルAをサービスにすることを提案しました。私はある誤解があり、シングルトンがCXFではなくAにあると人々は考えました。私はそれを試しても問題は解決しませんでした。
CXFクラスをロードするためにバンドルAが別のクラスローダーを使用するように、クラスローディングをオーバーライドします。私はこれに関するロジックを完全に理解していませんが、CXFバスとhttp-conduitを作成するためにSpring Beanが使用されていることを考えると、非常に扱いにくいものになるでしょう。より良いアイデアを得るには、下の(4)を参照してください。
CXFには、特定のスレッドコンテキストのCXFバスとhttpコンジットを設定する方法があります。私は本当にこのソリューションを使いたいですが、CXF Beanファイルを同等のJavaコードに変換する方法を理解できません。以下に、CXF Spring Beanファイルを示します。注このHTTPコンジットを使用してソースコードにアクセスすることはできません。なぜなら、SOAPService、wsdlなどへのアクセス権がないため、「Javaコードの使用」でthis link hereの例を使用していないからです。 ...
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="searchSystemEnvironment" value="true" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <cxf:bus> <cxf:outInterceptors> <bean class="com.xenara.messaging.security.IdentityAssertingOutInterceptor" scope="singleton" /> </cxf:outInterceptors> <cxf:features> <wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing"/> </cxf:features> </cxf:bus> <http-conf:conduit name="*.http-conduit"> <http-conf:client AllowChunking="false" Connection="Keep-Alive" /> <http-conf:tlsClientParameters disableCNCheck="true" secureSocketProtocol="TLS"> <sec:keyManagers keyPassword="${javax.net.ssl.keyStorePassword}"> <sec:keyStore type="JKS" password="${javax.net.ssl.keyStorePassword}" file="${javax.net.ssl.keyStore}" /> </sec:keyManagers> <sec:trustManagers> <sec:keyStore type="JKS" password="${javax.net.ssl.trustStorePassword}" file="${javax.net.ssl.trustStore}" /> </sec:trustManagers> <sec:cipherSuitesFilter> <sec:include>SSL_RSA_WITH_3DES_EDE_CBC_SHA</sec:include> ... </sec:cipherSuitesFilter> </http-conf:tlsClientParameters> </http-conf:conduit>
この問題では多くの時間が浪費され、最終的な解決策は、悲しいかな、私たちのFuseESB ServiceMix環境の外でプログラムを実行し、ActiveMQを通じてFuseESB Servicemixと話すことでした。 – Thirlan