2016-03-23 15 views
1

次のテストコードがあります。これは、テストサービスを登録し、登録を解除する必要があります。 Eclipse 4.5.2 Mail-Demoアプリケーションでテストしました。問題は、サービスが登録解除されていないこと、サービスの2番目の呼び出しがnullでないことです。OSGiサービスの登録を解除する方法

BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext(); 

ServiceRegistration<ITestService> registration = bundleContext.registerService(ITestService.class, new TestService(), null); 

ServiceReference<ITestService> serviceReference = bundleContext.getServiceReference(ITestService.class); 
bundleContext.ungetService(serviceReference); 

serviceReference = bundleContext.getServiceReference(ITestService.class); 
System.out.println("should be null but is not: " + serviceReference); 

これは私が得る出力されます:

should be null but is not: {unregister.osgiservice.ITestService}={service.id=172, service.bundleid=8, service.scope=singleton} 

私が正しくサービスの登録を解除するにはどうすればよいですか?


編集:
私がServiceRegistration.unregister()を見つけた場合は、サービスを登録していない下のコードを追加してください。どのサービスが登録されている別の場所からServiceRegistrationを取得するには、次の質問が表示されますか?

registration.unregister(); 

serviceReference = bundleContext.getServiceReference(ITestService.class); 
System.out.println("now the service is null: " + serviceReference); 

出力:

should be null but is not: {unregister.osgiservice.ITestService}= service.id=174, service.bundleid=8, service.scope=singleton} 
now the service is null: null 

答えて

0

、私は内部クラスを使用して、この厄介な回避策が見つかりました:

((org.eclipse.osgi.internal.serviceregistry.ServiceReferenceImpl) serviceReference).getRegistration().unregister(); 

確かにこれは悪いですが、私はServiceRegistrationを取得するためのソリューションを必要としています。 Eclipse Gemini Blueprint(元の春のDM)を使って私のサービスを登録しているので、起動時にServiceRegistrationを保存できません。

+0

これは本当に非常に悪いです。パッケージ内に「内部」があるものはEclipse APIの一部ではなく、いつでも変更することができます。 –

+0

はい、私はそれを認識しており、より良い方法を見つけることはできませんでした。私のユースケースでは、これは仕事です。 –

+0

非常に悪いことに、私たちはある日失敗してしまい、oherフレームワークの使用を禁止しています。 –

1

ungetServiceだけで、特定のサービス参照をドロップし、それがサービスの登録を解除しません。

registerServiceは、サービスの登録を解除するために使用することができますServiceRegistration返します

ServiceRegistration<ITestService> reg = bundleContext.registerService(ITestService.class, new TestService(), null); 

... 

reg.unregister(); 

それは、サービス登録を追跡するのはあなた次第です。多くのプラグインはそれらをプラグインアクティベータに保存します。また、Activator startメソッドでサービスを登録し、stopメソッドで登録を解除することも一般的です。上記のグレッグの答えにもかかわらず

+0

"getServiceReferenceはServiceRegistrationを返します"という意味は、 "ServiceReferenceを返しますか"でしたか? –

+0

ごめんなさいregisterService –

+0

いいえ、登録が必要です。 –

関連する問題