OSGI + CDI:系统打印机检测到的奇怪行为

时间:2015-06-14 10:59:36

标签: java osgi cdi weld pax

我有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

如何解释?

2 个答案:

答案 0 :(得分:0)

PrintServiceLookup是在单独的包中定义还是使用来自单独的OSGI服务的代码?它可能与osgi服务基数有关吗?

答案 1 :(得分:0)

在您的第一个代码段中,PrintServiceLookup.lookupPrintServices在不同的LifeCycle阶段中调用,而不是在第二个代码段中调用。

在第一个示例中,当PrintServiceLookup被调用时,Container或Extender可能不满足lookupPrintServices的所有依赖关系。

在第二个示例中,可能会满足这些依赖关系,因为在Bundle Activator的lookupPrintServices方法中调用start - 在STARTING阶段由Container调用。在STARTING阶段,Bundle的所有依赖关系已经由Container解决。

希望我能提供帮助。