2015-06-14 3 views
0

У меня есть приложение для CDI + OSGI javase. CDI-Weld, OSGI-felix и pax-cdi. И у меня есть следующий код в «CDI-магистральный»OSGI + CDI: странное поведение с обнаружением системных принтеров

@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

Возможно, это связано с произвольным началом заказа. Символ # vs $, очевидно, не связан, это просто случайно. –

ответ

0

Является ли PrintServiceLookup определенным в отдельном пакете или использует код, который является отдельным сервисом OSGI? Может ли это быть связано с мощностями служб osgi?

0

В вашем первом фрагменте кода PrintServiceLookup.lookupPrintServices вызывается в другой фазе жизненного цикла, чем во втором фрагменте.

В первом примере Контейнер или Расширитель может не удовлетворять всем зависимостям для PrintServiceLookup, когда вызывается lookupPrintServices.

Во втором примере эти зависимости, вероятно, будут удовлетворены, так как lookupPrintServices вызывается в методе start активатора Bundle Activator, который вызывается контейнером во время фазы STARTING. На этапе STARTING все зависимости Bundle уже разрешены контейнером.

Надеюсь, что смогу помочь.

Смежные вопросы