2014-01-22 2 views
2

2 개의 iPOJO 구성 요소가 있습니다.iPOJO 구성 요소가 인스턴스화되었지만 가시적 인 출력이 없습니다.

1- "Hello"서비스를 제공하는 공급자 번들.

package helloipojo; 


import helloipojo.service.HelloService; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Invalidate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.ipojo.annotations.Validate; 


@Component(name="my-factory") 
@Provides 
public class HelloServiceImpl implements HelloService{ 

    @Override 
    public void sayHello() { 

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

    } 


    @Validate 
    public void start() throws Exception { 

     System.out.println("Hello, I am ipojo bundle start method"); 

    } 

    @Invalidate 
    public void stop() throws Exception { 

     System.out.println("Bye Bye, I am ipojo bundle stop method"); 

    } 



} 

2 소비자 번들 follwing을로의 HelloService 객체를 사용 : 별도의 Java 응용 프로그램에서

package helloserviceconsumer; 

import helloipojo.service.HelloService; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Invalidate; 
import org.apache.felix.ipojo.annotations.Requires; 
import org.apache.felix.ipojo.annotations.Validate; 

@Component(name="my-consumer-factory") 
public class HelloConsumer { 
       @Requires 
       HelloService helloObject; 

       @Validate 
       private void start() { 
         // Starting method 
         //... 
         helloObject.sayHello(); 
         //... 
       } 

       @Invalidate 
       protected void stop() { 
         // Stopping method 
         if(helloObject!=null) { helloObject.sayHello(); } 

         else System.out.println("hello service GONE!"); 
       } 
} 

, 나는이 두 번들을로드하고 아파치를 시작 아래 구성 요소의 구현은 다음과 같은 펠릭스 :

Bundle b = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Desktop\\plugins\\HelloService_1.0.0.201401222235.jar"); 
b.start(); 

Bundle c = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Desktop\\plugins\\HelloServiceConsumer_1.0.0.201401222257.jar"); 
c.start(); 

위의 모든 작업이 정상적으로 작동합니다.

이제이 두 구성 요소를 동적으로 인스턴스화하고 번들 소비자가 번들 제공자 서비스의 사용을 관찰하고 싶습니다. 다음과 같이 Instance Declaration을 사용했습니다.

DefaultInstanceDeclaration providerDeclaration = new DefaultInstanceDeclaration(b.getBundleContext(), "my-factory"); 
          providerDeclaration.start(); 

DefaultInstanceDeclaration consumerDeclaration = new DefaultInstanceDeclaration(c.getBundleContext(), "my-consumer-factory"); 
          consumerDeclaration.start(); 

응용 프로그램을 실행할 때 오류가 발생하지 않습니다. 그러나 서비스 공급자와 소비자 모두의 start() 메소드에 존재하는 "Hello"메시지를 볼 수 없습니다. 나는 절대적으로 아무것도 볼 수 없다. 즉, 구성 요소가 올바르게 인스턴스화되지 않았 음을 의미합니다. 나는 어디로 잘못 갔는가? 감사.

업데이트 나는 내 번들 iPOJO 조작을 적용하지 않았다는 것을 발견, 그래서 나는 다음과 같은, iPOJO 개미 작업을 사용하여 해당했다

: 이제

<project> 
<target name="main"> 
    <!-- Change the path to point on the iPOJO Ant task jar--> 
    <taskdef name="ipojo" 
     classname="org.apache.felix.ipojo.task.IPojoTask" 
     classpath="C:/Users/zaid.almahmoud/feasibility-codes/ipojo/ipojo-distribution-1.11.0/bundle/org.apache.felix.ipojo.ant-1.11.0.jar"/> 
    <ipojo 
     input="C:/Users/zaid.almahmoud/Desktop/plugins/HelloService_1.0.0.201401222235.jar" 
     output="C:/Users/zaid.almahmoud/Desktop/plugins/Manipulated_HelloService.jar" 
    /> 
</target> 
</project> 

것은, 내가 볼 수 내 응용 프로그램에서 공장 유효합니다. 다음 명령의 출력입니다.

g! ipojo:factories 
Factory my-factory (VALID) 
Factory org.apache.felix.ipojo.arch.gogo.Arch (UNKNOWN) - Private 

그러므로 "my-factory"팩토리는 이전과 달리 사용할 수 있습니다.

하지만, 내 경우는 다음과 같이 생성 된, 사용할 수 없습니다 : 다시

DefaultInstanceDeclaration providerDeclaration = new DefaultInstanceDeclaration(b.getBundleContext(), "my-factory"); 
         providerDeclaration.start(); 

,() 메소드를이 오류가 표시되지 않습니다, 그러나 그것은 시작에 예상되는 출력을 표시하지 않습니다 번들 중 하나이며 명령에서 볼 수 있습니다.

g! ipojo:instance my-factory-0 
Instance named 'my-factory-0' not found 
g! ipojo:instances 
Instance org.apache.felix.ipojo.arch.gogo.Arch-0 -> valid 

도와 주시겠습니까? 감사.

답변

0

인스턴스 선언을 사용하는 것이 적합하지 않았습니다. 비록, 나는 다음과 같이 공장 서비스를 사용하여 내 구성 요소를 인스턴스화 할 수 있었다 :이 코드는 내 자바 응용 프로그램에 의해로드됩니다 번들로를 배치 한 후 일을 가지고

ServiceReference[] references = context.getServiceReferences(Factory.class.getName(),"(factory.name=my-factory)"); 

    if (references == null) 
    System.out.println("No reference"); 


    else { 

      System.out.println(references[0].toString()); 

      Factory factory = context.getService(references[0]); 
      x = factory.createComponentInstance(null); //here instantiating my component 
      x.start(); //this starts my component service and executes start method 


      System.out.println(x.getState()); 
      System.out.println(x.getInstanceName()); 


      x.dispose(); //this stops my component service and executes stop method 

     } 

.