多个 OSGi 服务
Multiple OSGi services
我是 OSGi 新手,正在尝试使用 OSGi 开发应用程序。我有一个 OSGi 服务,它有一个接口和两个实现。
接口:ExportService
实施:ExcelExportServiceImpl
、PdfExportServiceImpl
ExportService
是我的接口,ExcelExportServiceImpl
、PdfExportServiceImpl
是 ExportService
.
的实现
我想要 ExcelExportServiceImpl
和 PdfExportServiceImpl
作为两个不同的服务。
从我的应用程序包中,如果我想使用 excel 导出,我应该能够在不涉及 PdfExportServiceImpl
.
的情况下调用 ExcelExportServiceImpl
服务
如何注册两个具有相同接口的不同服务?
@Override
public void start(BundleContext context) throws Exception {
context.registerService(ExportService.class.getName(), new ExcelExportServiceImpl(), null);
context.registerService(ExportService.class.getName(), new PdfExportServiceImpl(), null);
}
}
现在,我在我的激活器中想出了上面的代码,但它似乎不起作用,因为这两个服务的 ExportService.class.getName()
作为 class 名称。如何用一个接口在同一个bundle中实现两种不同的服务?
Update/Solution:
我在服务包的激活器中更改了如下代码,
@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);
}
并且在我的应用程序包中,我添加了以下过滤器
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();
}
上面的代码将注册两个具有相同接口的不同服务。这是正确的。
问题是通过接口绑定服务的消费者将获得这些服务之一,但无法决定哪个是正确的。
解决这个问题的一种方法是为每个服务注册添加属性。例如,您可以在 pdf 上设置一个 proerty type=pdf。
然后客户端可以通过接口和类似 (type=pdf) 的 ldap 过滤器绑定服务。然后它将只匹配 pdf ExportService 服务。
我是 OSGi 新手,正在尝试使用 OSGi 开发应用程序。我有一个 OSGi 服务,它有一个接口和两个实现。
接口:ExportService
实施:ExcelExportServiceImpl
、PdfExportServiceImpl
ExportService
是我的接口,ExcelExportServiceImpl
、PdfExportServiceImpl
是 ExportService
.
我想要 ExcelExportServiceImpl
和 PdfExportServiceImpl
作为两个不同的服务。
从我的应用程序包中,如果我想使用 excel 导出,我应该能够在不涉及 PdfExportServiceImpl
.
ExcelExportServiceImpl
服务
如何注册两个具有相同接口的不同服务?
@Override
public void start(BundleContext context) throws Exception {
context.registerService(ExportService.class.getName(), new ExcelExportServiceImpl(), null);
context.registerService(ExportService.class.getName(), new PdfExportServiceImpl(), null);
}
}
现在,我在我的激活器中想出了上面的代码,但它似乎不起作用,因为这两个服务的 ExportService.class.getName()
作为 class 名称。如何用一个接口在同一个bundle中实现两种不同的服务?
Update/Solution:
我在服务包的激活器中更改了如下代码,
@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);
}
并且在我的应用程序包中,我添加了以下过滤器
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();
}
上面的代码将注册两个具有相同接口的不同服务。这是正确的。
问题是通过接口绑定服务的消费者将获得这些服务之一,但无法决定哪个是正确的。
解决这个问题的一种方法是为每个服务注册添加属性。例如,您可以在 pdf 上设置一个 proerty type=pdf。
然后客户端可以通过接口和类似 (type=pdf) 的 ldap 过滤器绑定服务。然后它将只匹配 pdf ExportService 服务。