2009-11-17 13 views
11

私はOSGiプログラミングを開始しており、サービスを起動するには2つの方法があります。ServiceTrackerとServiceReferenceの使い分け

EclipseRCP帳から最初の方法、ServiceReferenceを使用しています。

String filter="(objectclass="+IModelCreator.class.getName()+")"; 
context.addServiceListener(this, filter); 
modelCreators = Collections.synchronizedMap(
    new HashMap<ModelID, List<IModelCreator>>()); 
ServiceReference references[] = context.getServiceReferences(null, filter); 
if(references==null) return; 
for(int i=0;i<references.length;++i) { 
    this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
     references[i])); 
} 

秒を、インターネットの例からは、ServiceTrackerを使用しています。

これらの一つが正しいおよび/またはある
ServiceTracker logReaderTracker = new ServiceTracker(context, 
       org.osgi.service.log.LogReaderService.class.getName(), null); 
logReaderTracker.open(); 
Object[] readers = logReaderTracker.getServices(); 
if (readers != null) { 
     for (int i = 0; i < readers.length; i++) { 
     LogReaderService lrs = (LogReaderService) readers[i]; 
     m_readers.add(lrs); 
     lrs.addLogListener(m_logger); 
    } 
} 
logReaderTracker.close(); 

特定のインタフェースを実装するすべてのサービスのレジスタを保持する最良の方法は?これを達成する別の方法がありますか?なぜ同じことをする2つの方法があるように見えますか?

答えて

15

すでにパッケージ名org.osgi.util.tracker.ServiceTrackerが(場合によっては)

ユーティリティクラスServiceTrackerあるフォームを導き出すことができたよう Frameworkのサービスレジストリからサービスを使用して簡素化します。

プログラミングには、常にいくつかの方法があります。自分でServiceReferencesを管理することもできますし、あなたの問題に合っていたり、ユースケースを持つバンドルされたユーティリティクラスを使用したりすることもできます。

また、それの時間のほとんどは、ServiceTracker

A Comparison of Eclipse Extensions and OSGi Services

OSGi Service Tracker

Getting Started with OSGi: Consuming a Service

を使用するのが賢明であることを状態この Best practices for accessing services

いくつかの他のソースをチェック

関連する問題