2014-01-21 16 views
0

我想学习如何使用菲利克斯iPOJO API动态创建的组件。IPOJO - 与组件类型相关的工厂是无效的(不启动或缺少处理)

我有一个简单束与以下文件:

1- HelloService.java(包含服务接口)。

/* 
* @author zaid almahmoud 
* 
*/ 
package helloipojo.service; 

public interface HelloService 
{ 

    public void sayHello(); 

} 

2-它的实施HelloServiceImpl.java

package helloipojo; 

import helloipojo.service.HelloService; 


public class HelloServiceImpl implements HelloService{ 

    @Override 
    public void sayHello() { 

     System.out.println("Hello iPojo!"); 

    } 


} 

3- Activator.java

package helloipojo; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 


public class Activator implements BundleActivator { 


     public void start(BundleContext context) throws Exception { 


      System.out.println("Bundle Started!"); 


     } 
     public void stop(BundleContext context) throws Exception { 

      context = null; 
      System.out.println("Bundle Stopped!"); 


     } 

} 

4- MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: HelloIPojo 
Bundle-SymbolicName: HelloIPojo 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: helloipojo.Activator 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Import-Package: org.osgi.framework 

在我的申请我开始菲利克斯框架和部署以下束:

iPOJO (core) 
iPOJO Composite 
iPOJO API 

根据this源。

接下来,我安装我的包,并实例化的组件。下面是我的课:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import org.apache.felix.framework.Felix; 
import org.apache.felix.framework.util.FelixConstants; 
import org.osgi.framework.Bundle; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.BundleException; 
import org.osgi.framework.Constants; 
import org.osgi.framework.ServiceRegistration; 
import org.apache.felix.ipojo.ComponentInstance; 
import org.apache.felix.ipojo.ConfigurationException; 
import org.apache.felix.ipojo.MissingHandlerException; 
import org.apache.felix.ipojo.UnacceptableConfiguration; 
import org.apache.felix.ipojo.api.ComponentType; 
import org.apache.felix.ipojo.api.PrimitiveComponentType; 
import org.apache.felix.ipojo.api.Service; 

public class HostApplication 
{ 
    private HostActivator m_activator = null; 
    private Felix m_felix = null; 


    public HostApplication() 
    { 
     // Create a configuration property map. 
     Map config = new HashMap(); 
     config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); 
     // Create host activator; 
     m_activator = new HostActivator(); 
     List list = new ArrayList(); 
     list.add(m_activator); 

     config.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list); 

     try 
     { 
      // Now create an instance of the framework with 
      // our configuration properties. 
      m_felix = new Felix(config); 
      // Now start Felix instance. 
      m_felix.start(); 
     } 
     catch (Exception ex) 
     { 
      System.err.println("Could not create framework: " + ex); 
      ex.printStackTrace(); 
     } 


     // Register the application's context as an OSGi service! 
     BundleContext bundleContext1 = m_felix.getBundleContext(); 


       System.out.println("6"); 

       try { 

        //starting ipojo required bundles 
        Bundle coreBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo-1.6.2.jar"); 
        coreBundle.start(); 
        if(coreBundle.getState()== coreBundle.ACTIVE) 
         System.out.println("Core Bundle is Active!"); 

        Bundle apiBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo.api-1.6.0.jar"); 
        apiBundle.start(); 
        if(apiBundle.getState()== apiBundle.ACTIVE) 
         System.out.println("API Bundle is Active!"); 


        Bundle compositeBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo.composite-1.6.0.jar"); 
        compositeBundle.start(); 
        if(compositeBundle.getState()== compositeBundle.ACTIVE) 
         System.out.println("Composite Bundle is Active!"); 


//HERE INSTALLING AND STARTING MY BUNDLE!! 
Bundle b = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Desktop\\plugins\\HelloIPojo_1.0.0.201401211340.jar"); 
       b.start(); 

        try { 

         ComponentType type = new PrimitiveComponentType() 
           .setBundleContext(b.getBundleContext()) 
           .setComponentTypeName("hello.type") 
           .setClassName("helloipojo.HelloServiceImpl") 
           .setImmediate(true); 
         type.start(); 

         ComponentInstance instance = type.createInstance(); 



        } 

        catch (UnacceptableConfiguration 
          | MissingHandlerException | ConfigurationException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } // Create the instance 







        System.out.println("done starting bundles!"); 


       } catch (BundleException e) { 

        e.printStackTrace(); 

        System.out.println("Not done!"); 
       } 



       //shutdownApplication(); 

    } 

    public Bundle[] getInstalledBundles() 
    { 
     // Use the system bundle activator to gain external 
     // access to the set of installed bundles. 
     return m_activator.getBundles(); 
    } 

    public void shutdownApplication() 
    { 
     // Shut down the felix framework when stopping the 
     // host application. 
     try { 
      m_felix.stop(); 
     } catch (BundleException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try { 
      m_felix.waitForStop(0); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

当我运行我的应用程序,它显示下面的输出(带有错误的结尾):

6 
Core Bundle is Active! 
API Bundle is Active! 
Composite Bundle is Active! 
Bundle Started! 
Exception in thread "main" java.lang.IllegalStateException: The factory associated with the component type is invalid (not started or missing handlers) 
    at org.apache.felix.ipojo.api.ComponentType.ensureFactory(ComponentType.java:189) 
    at org.apache.felix.ipojo.api.ComponentType.ensureAndGetFactory(ComponentType.java:177) 
    at org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79) 
    at HostApplication.<init>(HostApplication.java:109) 
    at Embedder.main(Embedder.java:11) 

哪儿我去错了吗?谢谢。

更新1

我可以看到,我很想念2个处理器。我知道通过添加以下两行:

System.out.println(type.getFactory().getRequiredHandlers()); 
System.out.println(type.getFactory().getMissingHandlers()); 

上述两条线的输出是:

[org.apache.felix.ipojo:architecture, org.apache.felix.ipojo:callback] 
[org.apache.felix.ipojo:architecture, org.apache.felix.ipojo:callback] 

我也尝试:

type.getFactory().createComponentInstance(new Properties());

然后我得到:

org.apache.felix.ipojo.MissingHandlerException: Missing handlers : org.apache.felix.ipojo:architecture org.apache.felix.ipojo:callback 

我不知道为什么这些处理程序缺失。我试图将它们添加,但无法找出正确的语法。任何帮助?谢谢。

更新2

根据克莱门特his答案,我的包应该导入:org.apache.felix.ipojoorg.apache.felix.ipojo.architecture

我这样做,现在我收到以下错误:

java.lang.ClassCastException: org.apache.felix.ipojo.HandlerManagerFactory cannot be cast to org.apache.felix.ipojo.HandlerFactory 

我在此行发现错误:type.start();

请帮忙。谢谢!

回答

1

问题来自iPOJO的异步启动。当你创建你的实例时,并不是所有的东西都可用。

我有几个问题:你为什么使用iPOJO API来声明你的类型和实例?你不能只使用注释吗?在这种情况下,它会顺利地创造一切。

如果您确实需要/想要使用API​​,请不要像您那样创建实例,而是公开实例声明:http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-factory-service.html#deleting-instances。声明等待,直到工厂有效创建实例。

+0

谢谢。我的第一个目标是能够动态地创建,启动和停止组件。我不认为这是可能的注释,是吗? 我试过这个: \t InstanceDeclaration declaration = new DefaultInstanceDeclaration(b.getBundleContext(),“my-factory”); 它显示没有错误,但您发布的链接的作者说您可以启动和停止声明实例。虽然,我没有找到一个开始或停止方法(declaration.start()显示语法错误)。这是怎么回事? –

+0

如果您可以使用代码片段更新您的答案,以显示正确的语法,我将非常感激。 –

+0

最后,我是否可以使用声明实例完全访问我的捆绑服务,引用,属性?我可以使用该实例动态操作这些吗?非常感谢。 –

相关问题