получить список реализаций сервисов с декларативными сервисами OSGi - PullRequest
0 голосов
/ 06 октября 2011

У меня есть очень простой пример декларативных услуг.Я следую этому уроку http://www.eclipsezone.com/eclipse/forums/t97690.html?start=0. Все работает как положено.Однако я не могу понять, как я могу сделать так, чтобы «SampleImporter» (который является пакетом, который, как ожидается, будет использовать сервисы других пакетов), знал о списке «SampleExporter» (пакет, предоставляющий услугу).Другими словами, я хочу, чтобы «SamlpeImporter» видел идентификатор пакета (ов), который он в конечном итоге использует.Эта информация очень полезна для моего приложения.

вот XML-файл для SampleExporter:

<?xml version="1.0"?>
<component name="samplerunnable">
<implementation class="org.example.ds.SampleRunnable"/>
<property name="ID" value="expoter" />
<service>
<provide interface="java.lang.Runnable"/>
</service>

, а для SampleImporter:

<?xml version="1.0"?>
<component name="commandprovider1">
<implementation class="org.example.ds.SampleCommandProvider1"/>
<service>
<provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="RUNNABLE"
    interface="java.lang.Runnable"
    bind="setRunnable"
    unbind="unsetRunnable"
    cardinality="0..1"
    policy="dynamic"/>
</component>

На стороне Импортера у меня есть следующая функция:

public class SampleCommandProvider1 implements CommandProvider {
    private Runnable runnable;
public synchronized void setRunnable(Runnable r) {
    runnable = r;
}
public synchronized void unsetRunnable(Runnable r) {
    runnable = null;
}
public synchronized void _run(CommandInterpreter ci) {
    if(runnable != null) {
            runnable.run();
    } else {
        ci.println("Error, no Runnable available");
    }
}
public String getHelp() {
    return "\trun - execute a Runnable service";
}

}

Это работает нормально, но тогда, если я хочу получить значение свойства, используя

public synchronized void setRunnable(Runnable r, Map properties)

или

public synchronized void setRunnable(Runnable r, ServiceReference reference)

метод запуска экспортера никогда не вызывается, что означает, что функция привязки (setRunnable не вызывается). Однако, используя консольную команду "services", я вижу, чтоЭкспортерский пакет используется импортером.Кроме того, используя ss и ls, я вижу, что компонент eporter "удовлетворен".Что не так с моей реализацией?

Заранее спасибо

Приветствия

Мари

1 Ответ

2 голосов
/ 07 октября 2011

Следующая подпись связывания не поддерживается ни одной версией DS:

public void setRunnable(Runnable r, ServiceReference ref)

Вместо этого вам придется взять только ServiceReference и использовать ComponentContext или BundleContext для доступа к объекту экземпляра службы.

В качестве альтернативы, если вам нужен более удобный способ доступа к свойствам службы в стиле POJO, в DS 1.1 разрешена следующая подпись привязки (но не в DS 1.0):

public void setRunnable(Runnable r, Map properties)

Чтобы получить доступ к функциям DS 1.1, вам нужно добавить правильное пространство имен в ваш XML следующим образом:

<component xmlns='http://www.osgi.org/xmlns/scr/v1.1.0' name='...'>

Кстати, я написал эту оригинальную статью очень давно! В эти дни я использовал бы bnd аннотаций , чтобы избежать необходимости писать XML-документ вручную.

...