2011-02-09 5 views
5

특히 OSGi와 관련하여 프레임 워크 코드에서 애플리케이션 코드를 분리하는 모범 사례 또는 패턴을 알고 싶습니다.OSGi loose-coupling best practice

나는 example from the Felix SCR pages

예제 서비스를 사용하는거야는 그것을 집중하고 간결한 것), 비교기 (

package sample.service; 
import java.util.Comparator; 
public class SampleComparator implements Comparator 
{ 
    public int compare(Object o1, Object o2) 
    { 
     return o1.equals(o2) ? 0 : -1; 
    } 
} 

위의 코드는 어떤 프레임 워크 배관을 포함하지 않습니다. OSGi를 사용할 때이를 응용 프로그램에서 사용할 수 있도록하려면 서비스 레지스트리에 등록해야합니다. 링크 된 Felix 페이지에 설명 된 것과 같은 한 가지 방법은 Service Component Runtime을 사용하는 것입니다.

Service-Component: OSGI-INF/sample.xml 

// OSGI-INF/sample.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<component name="sample.component" immediate="true"> 
    <implementation class="sample.service.SampleComparator" /> 
    <property name="service.description" value="Sample Comparator Service" /> 
    <property name="service.vendor" value="Apache Software Foundation" /> 
    <service> 
    <provide interface="java.util.Comparator" /> 
    </service> 
</component> 

모든 좋은 사랑스러운, 내 서비스 구현은 OSGI에 전혀 연결이 없습니다. 나는 또한 추가 할 필요가 SCR 이벤트 전략을 사용

protected void activate(ComponentContext context) { 
    Comparator c = (Comparator) context.locateService("sample.component"); 
} 

: 나는 프레임 워크 전용 메소드를 추가 할 필요가 SCR 조회 전략을 사용

지금이 서비스를 사용하려면 ...

package sample.consumer; 
import java.util.Comparator; 
public class Consumer { 
    public void doCompare(Object o1, Object o2) { 
     Comparator c = ...; 
    } 
} 

프레임 워크 만의 방법 :

protected void bindComparator(Comparator c) { 
    this.c = c; 
} 

protected void unbindComparator(Comparator c) { 
    this.c = null; 
} 

나는 당신이 위스콘신 이러한 종류의 코드가 클래스에서 중복되어 상당한 양의 필터링을 수행 할 수 있습니다.

내가 볼 수있는 가능한 해결책 중 하나는 OSGi 특정 클래스를 사용하여보다 전통적인 방법과 프레임 워크를 통해 소비자를 중재하는 것입니다.

package sample.internal; 
public class OsgiDependencyInjector { 
    private Consumer consumer; 
    protected void bindComparator(Comparator c) { 
     this.consumer.setComparator(c); 
    } 

    protected void unbindComparator(Comparator c) { 
     this.consumer.setComparator(null); 
    } 
} 

SCR 구성에서 어떻게 구성 할 지 모르겠습니다.

org.apache.felix.scr.annotations도 있습니다 만, 이는 maven-scr-plugin으로 빌드하는 경우에만 모두 작동한다는 것을 의미합니다. 그렇게 나쁜 것은 아니고 AFAICT는 런타임에 아무런 영향을 미치지 않습니다.

이제 모든 것을 읽었습니다. 프레임 워크 코드로 '오염 된'애플리케이션 코드없이 OSGi가 제공하는 서비스를 사용하는 가장 좋은 방법은 무엇이라고 생각하십니까?

답변

3

1) 나는 bind 메소드가 당신의 코드를 오염시키고 있다고 생각하지 않는다. 단지 bean setter 일 뿐이다. (좀더 전통적으로 setXXX라고 부를 수도있다.) 단위 테스트를 위해서도 필요합니다.

2) bnd (maven, ant, bndtools, eclipse plugin 등)를 사용하는 경우 bnd 주석을 사용할 수도 있습니다. bnd는 자동으로 (항상 끔찍한) xml을 자동으로 생성합니다. 매니페스트에서

package sample.service; 
import java.util.Comparator; 
import aQute.bnd.annotations.component.*; 

@Component 
public class SampleComparator implements Comparator { 
    public int compare(Object o1, Object o2) { 
     return o1.equals(o2) ? 0 : -1; 
    } 
} 

@Component 
class Consumer { 
    Comparator comparator; 

    public void doCompare(Object o1, Object o2) { 
     if (comparator.compare(o1,o2)) 
     .... 
    } 

    @Reference 
    protected setComparator(Comparator c) { 
     comparator = c; 
    } 
} 

, 단지 추가 :

Service-Component: * 

이 BND에 의해 포착됩니다. 따라서 도메인 코드에 OSGi 코드가 없습니다. 설정되지 않은 메소드가 없다는 것이 당황 할 수도 있지만 bnd의 기본값은 정적 바인딩입니다. 따라서 set 메소드는 활성화되기 전에 호출되며 unset이 호출되기 전에 비활성화됩니다. Consumer 객체가 μservice가 될 때까지는 안전합니다. μservices에 대한 자세한 내용은 bndtools, bnd 홈 페이지 및 내 blogs을 확인하십시오.

추신. o1! = o2 인 경우 o1이 o2보다 크거나 작 으면 모두 답할 것이기 때문에 샘플은 유효하지 않습니다. 이는 비교 자 계약에서 허용되지 않으며 정렬이 불안정 할 것입니다.

2

내 프로젝트에서 어떻게 작성하는지 알려 드리겠습니다. OSGi 컨테이너로서 우리는 Fuse ESB를 사용하고 있지만, Apache Karaf 내부의 어떤 곳을 찾을 수 있습니다. 코드를 오염시키지 않기 위해 우리는 OSGi 컨테이너와의 상호 작용을 매우 쉽게하는 Spring DM (http://www.springsource.org/osgi)을 사용합니다. 그것은 "Equinox 3.2.x, Felix 1.0.3+ 및 Knopflerfish 2.1.x에 대한 지속적인 통합 프로세스의 일환으로"(최신 릴리스) 테스트되었습니다.이 방법의

장점 : XML 파일

  • 모든 "OSGI"구성 - OSGi 컨테이너 보이는 방법

의 다른 구현에서 작동하는 코드가 아닙니다 오염

  • 능력? OSGi 프레임 레지스트리에

    • 게시 서비스 :

    < OSGI : 서비스 ID = "일부-ID" 심판 = "인터페이스 - 인터페이스를"콩 구현 서비스 -에 - 노출 " 의 - 당신의 서비스 OSGi 프레임 레지스트리에서 서비스 가져 오기 " />

    • :

    < OSGI : 기준 ID = "콩 ID"인터페이스 = "인터페이스의 노출 서비스"더욱이 />

    우리 받는다는 다발 - 플러그인을 사용하여 유효 OSGi 번들을 만들 .

  • 1

    aQute.bnd.annotations.component와 비교 한 felix 주석의 장점은 felix scr 플러그인 (개인 필드에 주석을 달 수 있음)에 의해 바인드 및 바인딩 해제 메소드가 자동으로 작성되는 것 같습니다. felix 플러그인의 단점은 자바 소스에서 작동하므로 다른 언어 (예 : 스칼라)로 만든 클래스 파일에는 작동하지 않는다는 것입니다.