我有CDI + OSGI javase应用程序。 CDI-Weld,OSGI-felix和pax-cdi。我在“CDI-main”中有以下代码
@ApplicationScoped
public class Foo{
public void postCreate(@Observes ContainerInitialized event, BundleContext ctx) throws Exception {
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("$Number of print services: " + printServices.length);
for (PrintService printer : printServices)
System.out.println("$Printer: " + printer.getName());
}
}
当我运行此应用程序时,我将获得以下输出(尽管我有正确驱动程序的打印机!)
$打印服务数量:0
注意,第一个标志是$; 如果我将以下代码添加到捆绑激活器并启动它
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("#Number of print services: " + printServices.length);
for (PrintService printer : printServices)
System.out.println("#Printer: " + printer.getName());
}
public void stop(BundleContext context) throws Exception {
}
}
注意,第一个标志是#。然后检测到我的所有打印机:
#Number of print services: 1
#Printer: MF3110
Jun 14, 2015 1:47:34 PM org.jboss.weld.bootstrap.WeldStartup startContainer...
....
$Number of print services: 1
$Printer: MF3110
如何解释?
答案 0 :(得分:0)
PrintServiceLookup是在单独的包中定义还是使用来自单独的OSGI服务的代码?它可能与osgi服务基数有关吗?
答案 1 :(得分:0)
在您的第一个代码段中,PrintServiceLookup.lookupPrintServices
在不同的LifeCycle阶段中调用,而不是在第二个代码段中调用。
在第一个示例中,当PrintServiceLookup
被调用时,Container或Extender可能不满足lookupPrintServices
的所有依赖关系。
在第二个示例中,可能会满足这些依赖关系,因为在Bundle Activator的lookupPrintServices
方法中调用start
- 在STARTING阶段由Container调用。在STARTING阶段,Bundle的所有依赖关系已经由Container解决。
希望我能提供帮助。