2010-07-01 3 views
0

안녕 얘들 아. Eclipse RCP 애플리케이션에서 OSGi 서비스를 사용하고 있습니다. 그들을 추적하기 위해 우리는 org.osgi.util.tracker.ServiceTracker 클래스를 사용하고 있습니다. OSGi 서비스 추적기가 항상 작동하지 않는 경우

mailServiceTracker = new ServiceTracker(context, MailService.class.getName(), null); 
mailServiceTracker.open(); 
MailService service = (MailService) mailServiceTracker.getService(); 

지금 내 문제는 내가 새로운 서비스를 만들 때 getService() 방법은 자주 null을 반환처럼 응용 프로그램에서 샘플 코드 보인다. 이 코드는 응용 프로그램에서 오랜 시간 동안 존재하는 서비스에서 잘 작동하지만 새 서비스를 만들 때마다 서비스가 최종적으로 발견되어 추적 될 때까지 많은 작업을 수행해야합니다. 나는 정기적으로
  • 예를

    에 노력한다 '클린 ...'이클립스
  • 이클립스
  • 의 모든 프로젝트는

때때로 것들 도움이 명령 줄에서 프로젝트를 다시 빌드 '새로 고침' 때로는 그렇지 않습니다. 누구든지 해당 추적자에 대한 경험이 있으며이 동작을 피하는 방법과 생성 즉시 서비스를 추적하는 방법을 알려줄 수 있습니까?

감사합니다.

답변

2

문제는 원하는 서비스가 아직 작성되지 않았을 수 있습니다 (특히 번들 활성화 프로그램에서 일부 번들이 시작되지 않았을 수 있음). 여전히 서비스 추적기를 사용하려면 ServiceTrackerCustomizer를 제공하고 서비스가 올 때와 되돌아 오는 동안 추적해야합니다 (미안하지만 말장난은 없습니다).

또는 이것을 처리하는 선언적 서비스로 전환 할 수 있습니다.

+0

아, 재미 있습니다 ...이 'ServiceTrackerCustomizer' 클래스를 살펴 보겠습니다. 답변 해주셔서 감사합니다! –

0

서비스 추적기를 사용하지 마십시오. 그들은 당신의 삶을 단순하게 보이지만 모든 종류의 문제가 있습니다. 대신 선언적 서비스를 사용하는 방법을 살펴 보는 것이 좋습니다. 이클립스에서 DS에 대한 지원은 3.5 이후부터 매우 훌륭합니다.

서비스 추적기를 사용하는 것이 나쁜 생각 인 이유에 대한 자세한 내용은이 설명서와 관련 프레젠테이션을 참조하십시오. 이 추적 서비스의 상당히 낮은 수준의 방법이라는 사실 이외의 ServiceTrackers를 사용하여 아무 문제가 없습니다

http://equinoxosgi.org/

+0

"당신은 모든 종류의 문제가 있습니다"라는 말을 좀 더 구체적으로 설명해 주시겠습니까? DS보다 사용하기가 훨씬 쉬운 시나리오가 있기 때문에 그냥 무시하지 않을 것입니다. – akr

+0

제가 참조한 책에서, 6.2.3 "서비스 추적자 요약"절을보십시오. 이 책은 Service Trackers를 사용한 예제를 보여주고이 예제를 Eclipse RT 프로젝트의 Service Activator Toolkit으로 옮긴 다음 Declarative Services로 옮긴다. 저자는 Stackoverflow 질문에서 가능한 문제를 훨씬 더 잘 설명합니다. –

1

. 선언적 서비스는 훌륭한 메커니즘이라는 데 동의하지만, "모든 종류의 문제"때문에 ServiceTrackers를 무시하는 것은 나쁜 조언처럼 들립니다.

질문으로 돌아 가기.

서비스 추적 프로그램이 작성되고 열리 자마자 작성시 지정한 필터 조건과 일치하는 모든 서비스에 대한 액세스가 제공됩니다. 거기에 지연이 없습니다. 내가 생각할 수있는 유일한 점은 어떻게 든 번들이 올바르게 해석되지 않는다는 것입니다. 따라서 번들 A에서 등록 된 서비스는 ServiceTracker를 사용하여 번들 B에 표시되지 않습니다. 이를 확인하려면 먼저 서비스 인터페이스가 포함 된 패키지를 내 보낸 번들을 찾은 다음 A와 B가 실제로 연결되어 있는지 확인하십시오. 좀 더은 OSGi에서 업데이트/갱신 메커니즘을 설명하면서

: 당신은 OSGi에서 뭔가를 업데이트 할 때마다

, 그것은 두 단계 프로세스입니다.

내 보낸 패키지의 새 버전이 포함 된 번들을 업데이트한다고 가정 해 보겠습니다. 또한 그것을 수입하는 소비자가 있다고 가정 해 봅시다. 번들을 업데이트 만하고 명시 적으로 새로 고치지 않는 한 (어떤 내보내기에 대한 가져 오기 링크) 소비자는 여전히 이전 버전의 패키지에 연결됩니다. 패키지 새로 고침 (PackageAdmin 서비스를 통해 OSGi에서 수행 할 수있는 작업)을 수행하면 소비자가 다시 해결되고 새 버전에 연결됩니다.

이것은 분리 된 여러 번들의 업데이트를 수행하고 각 업데이트 후에 "새로 고침"하지 않고 모든 새로 고침이 업데이트 될 때까지 새로 고침을 연기하려는 경우에 유용합니다.

이것이 실제로보고있는 효과 일 가능성이 큽니다. 처음에는 업데이트 만 수행하며 새로 고침 후에는 추적 프로그램이 실제로 새 버전의 서비스를 볼 수 있습니다.

+0

안녕 마르셀, 대답 해줘서 고마워. 번들간에 서비스를 참조 할 때만 문제가 발생하는지 여부는 확인하지 않았지만 잠시 후에 문제가 항상 사라 지므로 번들이 올바르게 해석되지 않는다고 생각합니다. 나는 상쾌하게하고 재 컴파일하는 것을 필요로한다. 그러나 잠시 후에 추적기는 작동하는 것처럼 보인다. 제 질문은, 그것들을 작동 시키려면 정확히 무엇을해야하며, 처음부터 제대로 작동하지 않는 이유는 무엇입니까? –

+0

아마 ST가 동기식이라는 것을 기억해야합니다. ST.open()을 호출하자마자 추적중인 모든 서비스를 받게됩니다. – akr

+0

David, ServiceTrackers에는 아무런 문제가 없습니다. 완벽하게 작동합니다. ServiceTracker에 서비스가 표시되지 않으면 해당 서비스가 없기 때문에 ServiceTracker가있을 수 있습니다. 실제로 서비스를 만들고 등록하는 코드를 자세히 살펴 보시기 바랍니다. 또한 OSGi 쉘에서 제공하는 명령을 사용하여 서비스가 등록되지 않은 이유를 진단하십시오. –