2011-10-06 3 views
0

나는 선언적인 서비스의 아주 간단한 예가있다. 나는이 튜토리얼 http://www.eclipsezone.com/eclipse/forums/t97690.html?start=0을 따라 가고있다. 모든 것이 예상대로 작동합니다. 그러나 "SampleImporter"(다른 번들의 서비스를 사용할 것으로 예상되는 번들)가 "SampleExporter"(서비스를 제공하는 번들) 목록을 인식하는 방법을 알 수는 없습니다. 다시 말해, "SamlpeImporter"가 결국 사용하고있는 번들의 ID를 보길 원합니다. 이 정보는 내 응용 프로그램에 매우 유용합니다. 여기 OSGi 선언적 서비스로 서비스 구현 목록 가져 오기

가했던 SampleExporter에 대한 XML 파일입니다

<?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 호출되지 않습니다.) 그러나, 콘솔 명령 "서비스"를 사용하여 나는 수출업자 번들이 imporeter 하나에 의해 사용되는 것을 참조하십시오. 또한, ss와 ls를 사용하면 구성 요소 송신자가 "만족"함을 알 수 있습니다. 구현 사례에 문제가 있습니까? 사전에

감사

건배

마리

+1

적어도 선언 서비스 XML을 추가하는 것이 좋습니다. 귀하의 질문이 무엇인지 파악하기 위해 기사를 읽는 것은 매우 편리하지 않습니다.그렇지 않으면 서비스 객체 대신 직접'ServiceReference'를 수신하도록 지정하면'ServiceReference.getBundle()'메소드를 사용하여 서비스를 등록한 번들을 검색 할 수 있습니다. –

+0

빠른 답장을 보내 주셔서 감사합니다. 오해의 소지가있는 초기 질문에 유감스럽게 생각합니다. 나는 나의 질문을 편집하고 가능한 한 명확 해 지려고 노력했다. 나는 내 생각으로는 그렇게 복잡한 것은 아니지만 나는 초보자이기 때문에 몇 가지 점을 지적하고있다. 나는 정말로 어떤 도움이나 힌트를 주셔서 감사합니다. – mimou

+0

메서드 sigurnature가 지원되지 않는 것이 문제입니다. 이 명세서에 따르면, 다음과 같은 시그니처가 지원된다 :'void (ServiceReference);','void ();','void (, Map)' –

답변

2

다음 바인드 서명이 DS의 모든 버전에서 지원하지 않는 :

public void setRunnable(Runnable r, ServiceReference ref) 

이 대신 당신이 을해야합니다 ServiceReference이고 ComponentContext 또는중 하나를 사용하십시오.- 서비스 인스턴스 개체에 액세스합니다. 당신이 서비스 등록 정보에 액세스 더 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 annotations을 사용하여 XML 문서를 직접 작성하지 않아도됩니다.

관련 문제