2015-11-06 63 views
1

我试过了这个组件工厂的示例link。 接口:karaf在组件工厂示例中不显示任何错误

package com.java.examplefactoryservice; 

public interface ExampleFactoryService { 
    public void start(); 

    public void stop(); 
} 

工厂提供:

package com.java.examplecomponentfactoryserviceprovider; 

import java.util.Map; 

import org.apache.felix.scr.annotations.Activate; 
import org.apache.felix.scr.annotations.Component; 

import com.java.examplefactoryservice.ExampleFactoryService; 

@Component(name = "ExampleComponentFactoryServiceProvider", factory = "example.factory.provider") 
public class ExampleComponentFactoryServiceProvider implements ExampleFactoryService { 

    @Activate 
    public void activate(Map<String, Object> properties) { 
     System.out.println("Actiavted!!!"); 
    } 

    @Override 
    public void start() { 
     System.out.println("Started !!!!"); 
    } 

    @Override 
    public void stop() { 
     System.out.println("Stopped!!!"); 
    } 

} 

厂长:

package com.java.examplecomponentfatorymanager; 

import java.util.Map; 

import org.apache.felix.scr.annotations.Activate; 
import org.apache.felix.scr.annotations.Component; 
import org.apache.felix.scr.annotations.Reference; 
import org.osgi.service.component.ComponentFactory; 
import org.osgi.service.component.ComponentInstance; 

import com.java.examplefactoryservice.ExampleFactoryService; 

@Component(name = "ExampleComponentFactoryManager", enabled = true, immediate = true) 
public class ExampleComponentFactoryManager { 

    @Reference(target = "(component.factory=example.factory.provider)", bind = "setFactory", unbind = "unsetFactory") 
    private ComponentFactory factory; 

    private ComponentInstance instance; 

    private ExampleFactoryService service; 

    @Activate 
    public void activate(Map<String, Object> properties) { 
     System.out.println("activate in manager !!!!"); 
     instance = factory.newInstance(null); 
     service = (ExampleFactoryService) instance.getInstance(); 
     System.out.println("service = " + service.toString()); 
    } 

    public void setFactory(final ComponentFactory factory) { 
     this.factory = factory; 
     System.out.println("setfactory called"); 
    } 

    public void unsetFactory(ComponentFactory factory) { 
     this.factory = null; 
     System.out.println("Unset factory called"); 
    } 

} 

一切顺利的编译和安装在karaf 2.3.10。工厂已成功注册。但没有任何显示。

karaf输出:

[ 71] [Active  ] [   ] [ 80] osgi.cmpn (4.3.1.201210102024) 
[ 79] [Active  ] [   ] [ 80] testI (0.0.1.SNAPSHOT) 
[ 80] [Active  ] [   ] [ 80] testImpl (0.0.3.SNAPSHOT) 
[ 110] [Active  ] [   ] [ 80] Apache Felix Declarative Services (1.6.0) 
[ 140] [Active  ] [   ] [ 80] ExampleFactoryService (0.0.1.SNAPSHOT) 
[ 152] [Active  ] [   ] [ 80] ExampleComponentFactoryServiceProvider (0.0.1.SNAPSHOT) 
[ 158] [Active  ] [   ] [ 80] ExampleComponentFatoryManager (0.0.1.SNAPSHOT) 

SCR:列表输出

[9 ] [FACTORY   ] ExampleComponentFactoryServiceProvider 

SCR:细节

scr:deactivate scr:details 
[email protected]> scr:details ExampleComponentFactoryServiceProvider 
Component Details 
    Name    : ExampleComponentFactoryServiceProvider 
    State    : FACTORY 
    Properties   : 
    service.vendor=The Apache Software Foundation 
    component.factory=example.factory.provider 
    component.name=ExampleComponentFactoryServiceProvider 
References 

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>ExampleComponentFatoryManager</groupId> 
    <artifactId>ExampleComponentFatoryManager</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <build> 
     <sourceDirectory>src</sourceDirectory> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <version>2.3.5</version> 
       <configuration> 
        <instructions> 
         <Import-Package> 
          *, 
          javax.servlet*;version="[2.5,4)" 
         </Import-Package> 
        </instructions> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-scr-plugin</artifactId> 
       <version>1.14.0</version> 
       <executions> 
        <execution> 
         <id>generate-scr-scrdescriptor</id> 
         <goals> 
          <goal>scr</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>org.apache.felix.scr.annotations</artifactId> 
      <version>1.9.6</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>org.osgi.compendium</artifactId> 
      <version>1.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.osgi</groupId> 
      <artifactId>org.osgi.core</artifactId> 
      <version>4.3.1</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>ExampleFactoryService</groupId> 
      <artifactId>ExampleFactoryService</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 
</project> 

最初我尝试在karaf命令行中安装捆绑包而不是名称,它显示捆绑包的绝对路径。经过一段时间,我试图通过放置捆绑包来展示捆绑包的确切名称。 我不明白karaf为什么在执行适当的命令行安装时未显示软件包名称的行为。它完全不显示任何错误[dependency/compilation/wiredexecption]。任何人都可以告诉我包中有什么问题吗?

+0

是从'SCR全输出:list'? 'ExampleComponentFactoryManager'缺少 –

+0

是的。我只安装了一个软件包。 ExampleComponentFactoryManager不显示在scr:list中。 – Shriram

+0

@Neil,至少我期待SOP将被打印。但没有打印。另外,如果我通过cmd行安装它,捆绑包名称不会显示,而是显示绝对路径。我不明白卡拉夫的行为。这是卡拉夫的性能问题还是我做错了什么? – Shriram

回答

0

你可以去导入aQute.bnd.annotation而不是 为karaf导入org.apache.felix.scr.annotations。

参考下面的代码

@Component(name="ExampleComponentFactoryManager",immediate=true,enabled=true) 
public class ExampleComponentFactoryManager 
{ 

    private static final Logger LOG = LoggerFactory.getLogger(ExampleComponentFactoryManager.class); 

    private ComponentFactory factory; 

    // @Reference(target = "(component.factory=example.factory.provider)",unbind = "unsetFactory") 
    //private ComponentFactory factory; 

    private ComponentInstance instance; 

    private ExampleFactoryService service; 

    @Activate 
    public void activate(Map<String, Object> properties) { 
     LOG.info("activation factorymanager"); 
     instance=factory.newInstance(null); 
     service =(ExampleFactoryService)instance.getInstance(); 
     LOG.info("service instance from factory "+service.toString()); 

    } 
    @Reference(target = "(component.factory=example.factory.provider)",unbind = "unsetFactory") 
    public void setFactory(final ComponentFactory factory) { 
     LOG.info("set Factory"); 
     this.factory = factory; 
     System.out.println("setfactory called"); 
    } 

    public void unsetFactory(ComponentFactory factory) { 
     this.factory = null; 
     System.out.println("Unset factory called"); 
    } 
}