2016-04-26 14 views
1

Ich bin neu in OSGi und versuche, eine Anwendung mit OSGi zu entwickeln. Ich habe einen OSGi-Dienst, der eine Schnittstelle und zwei Implementierungen hat.
Schnittstelle:Exportservice
Implementationen:ExcelExportServiceImpl, PdfExportServiceImpl
Exportservice ist meine Schnittstelle und ExcelExportServiceImpl, PdfExportServiceImpl die Implementierungen von Exportservice sind. Ich möchte ExcelExportServiceImpl und PdfExportServiceImpl als zwei verschiedene Dienste.
Wenn ich in meinem Anwendungspaket den Excel-Export verwenden möchte, sollte ich den ExcelExportServiceImpl-Dienst aufrufen können, ohne PdfExportServiceImpl einzubeziehen. Wie registriere ich zwei verschiedene Dienste, die dieselbe Schnittstelle haben?Mehrere OSGi-Dienste

@Override 
public void start(BundleContext context) throws Exception { 
     context.registerService(ExportService.class.getName(), new ExcelExportServiceImpl(), null); 
     context.registerService(ExportService.class.getName(), new PdfExportServiceImpl(), null); 
    } 
} 

Vorerst kam ich mit dem obigen Code in meinem Aktivator und es scheint nicht da zu arbeiten sowohl der Service ExportService.class.getName() als Klassennamen hat. Wie erreicht man zwei verschiedene Dienste in einem Bündel mit einer Schnittstelle?

Update:
Lösung:

ich den Code wie unten in meinem Dienst Bundle Aktivator geändert,

@Override 
public void start(BundleContext context) throws Exception { 
     Hashtable excelProperty = new Hashtable(); 
     excelProperty.put("type", "excel"); 
     excelServiceRegistration = context.registerService(ExportService.class.getName(), new ExcelExportServiceImpl(), excelProperty); 
     Hashtable pdfProperty = new Hashtable(); 
     pdfProperty.put("type", "pdf"); 
     pdfServiceRegistration = context.registerService(ExportService.class.getName(), new PdfExportServiceImpl(), pdfProperty); 
} 

Und in meinem Anwendungspaket, habe ich die folgenden Filter

public static void startBundle(BundleContext context) throws InvalidSyntaxException { 
    String EXCEL_FILTER_STRING = "(&(" + Constants.OBJECTCLASS + "=com.stpl.excel.api.ExportService)" + "(type=excel))"; 
    String PDF_FILTER_STRING = "(&(" + Constants.OBJECTCLASS + "=com.stpl.excel.api.ExportService)" + "(type=pdf))"; 
    Filter excelFilter = context.createFilter(EXCEL_FILTER_STRING); 
    Filter pdfFilter = context.createFilter(PDF_FILTER_STRING); 
    ServiceTracker excelService = new ServiceTracker(context, excelFilter, null); 
    ServiceTracker pdfService = new ServiceTracker(context, pdfFilter, null); 
    excelService.open(); 
    pdfService.open(); 
} 

Antwort

4

Der obige Code registriert zwei verschiedene Dienste mit derselben Schnittstelle. Das ist richtig.

Das Problem ist, dass ein Verbraucher, der den Dienst über die Schnittstelle bindet, einen dieser Dienste erhält und nicht entscheiden kann, welcher der richtige ist.

Eine Möglichkeit, dies zu lösen, besteht darin, jeder Serviceregistrierung Eigenschaften hinzuzufügen. Zum Beispiel könnte es einen proerty type = pdf geben, den Sie auf der pdf-Datei einstellen.

Dann könnte der Client den Dienst über Schnittstelle und einen ldap-Filter wie (Typ = pdf) binden. Es entspricht dann nur dem PDF ExportService-Dienst.

+0

Danke Christian, das hat funktioniert !! – SDJ

Verwandte Themen