Компоненты iPOJO созданы, но нет видимых выходных данных

У меня есть 2 компонента 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- Потребительский пакет, который использует объект HelloService следующим образом:

 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!");
                }
}

В отдельном Java-приложении я загружаю эти два пакета и запускаю их в Apache Felix следующим образом:

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();

Все вышеперечисленное работает нормально.

Теперь я хотел бы динамически создавать экземпляры этих двух компонентов и наблюдать за использованием службы поставщика пакета потребителем пакета. Я использовал объявление экземпляра следующим образом:

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

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

Никаких ошибок при запуске приложения. Однако я не мог видеть сообщения «Hello», которые существуют в методах start() как поставщика услуг, так и потребителя. Я абсолютно НИЧЕГО не вижу. Это означает, что компоненты не созданы правильно. Где я ошибся? Спасибо.

Обновить

Я обнаружил, что не применял манипуляции с iPOJO к своему пакету, поэтому я сделал это с помощью iPOJO Ant Task следующим образом:

<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

Поэтому фабрика "моя фабрика" доступна в отличие от ранее.

Однако мой экземпляр недоступен, который был создан следующим образом:

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

Опять же, это не показывает ошибку, но не отображает ожидаемый результат в методе 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

Можете ли вы помочь, пожалуйста? Спасибо.


person Traveling Salesman    schedule 22.01.2014    source источник


Ответы (1)


Использование объявления экземпляра у меня не сработало. Тем не менее, я смог создать экземпляр своего компонента с помощью Factory Service следующим образом:

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

         }

Я заставил этот код работать только после помещения его в пакет, который будет загружен моим java-приложением.

person Traveling Salesman    schedule 01.02.2014