У меня очень простой поставщик услуг и потребитель. По какой-то причине я не могу решить проблему, что мой потребитель будет использовать сервис провайдера. Вот расслоением исходный код поставщика:Состояние неудовлетворенное (справочное) для обслуживания в Карафе - где ошибка? (OSGi, декларативное обслуживание, аннотации)
package test;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
@Component (name = "MyProvider", immediate = true)
public class TestClass implements SimpleMathI {
public TestClass() {
System.out.println("contructing TestClass");
}
@Activate
protected void activate(ComponentContext c, BundleContext b) {
System.out.println("activate testClass ");
}
@Deactivate
protected void deactivate() {
System.out.println("de-activate testClass");
}
@Override
public void doSimpleAdd(int x, int y) {
System.out.println("Result(TestClass): " + (x + y));
}
@Override
public void doSimpleSubstract(int x, int y) {
System.out.println("Result(TestClass): " + (x - y));
}
}
регистрирует компонент MyProvider и услуги test.SimpleMathI (listed in karaf)
Здесь потребитель:
Если я не ссылаться на службу SimpleMathI, но только ConfigurationAdmin работает отлично!
package test;
import org.osgi.framework.BundleContext;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
@Component (name = "MyConsumer", immediate = true, configurationPolicy = ConfigurationPolicy.OPTIONAL)
public class TestClass2 {
public TestClass2() {
System.out.println("contructing TestClass2");
}
@Reference (bind = "bind", unbind = "unbind")
ConfigurationAdmin cm; // works
@Reference (bind = "bindSimpleMathI", unbind = "unbindSimpleMathI")
SimpleMathI simpleMath; // does not work, see screenshot
@Activate
protected void activate(ComponentContext c, BundleContext b) {
System.out.println("activate testClass2");
// simpleMath.doSimpleAdd(20, 25);
}
@Deactivate
protected void deactivate() {
System.out.println("de-activate testClass2");
}
protected void bind(ConfigurationAdmin a) {
System.out.println("binding");
}
protected void unbind(ConfigurationAdmin a) {
System.out.println("un-binding");
}
protected void bindSimpleMathI(SimpleMathI a) {
System.out.println("binding!!");
}
protected void unbindSimpleMathI(SimpleMathI a) {
System.out.println("un-binding!!");
}
}
и здесь выход в Karaf webconsole.
Я достаточно гугл, но все еще не могу понять, что я пропустил. Странно, так как код очень прост и прозрачен. Итак, что я внедрил неверного поставщика или потребителя?
Karaf 4.0.7, не Apache не ФЕЛИКС используются, чистые OSGi R6 декларативные услуги
ОК, теперь я это понял. Также заметили, что большинство людей используют три подхода к пакету. Это имеет смысл. – neodix