У меня есть 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
Можете ли вы помочь, пожалуйста? Спасибо.