먼저 크라켄 Cron 서비스를 이용하는 예를 하나 생각해봅시다..
주기적으로 특정한 작업을 수행하고 싶을 때 아래와 같이 구현할 수 있습니다.
package org.krakenapps.example;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.krakenapps.cron.HourlyJob;
@Component(name = "my_job")
@Provides
@HourlyJob
public class MyJob implements Runnable {
@Override
public void run() {
System.out.println("blah blah");
}
}
이렇게 해놓고 iPOJO 메타데이터 파일(metadata.xml)에 아래처럼 한 줄만 쓰면 됩니다.
<instance component="my_job" />
(원한다면 크라켄 콘솔에서 수동으로 iPOJO 컴포넌트 인스턴스를 생성할 수도 있음)
그러면 이 클래스가 포함된 번들이 시작될 때 iPOJO가 my_job이라는 이름의 컴포넌트 인스턴스를 하나 생성하고 이것을 OSGi 서비스 레지스트리에 등록시킵니다. 그 때 Cron 서비스는 Runnable을 구현하는 서비스가 등록되었다는 콜백을 받게 되고, 어노테이션을 살펴보고 자신의 스케줄 목록에 등록합니다. 그 뒤에는 한 시간마다 run()이 호출되게 될 것입니다.
그럼 구체적으로 콜백을 어떻게 받게 되느냐..
public class JobServiceTracker extends ServiceTracker {
public JobServiceTracker(BundleContext bundleContext) {
super(bundleContext, Runnable.class.getName(), null);
}
@Override
public Object addingService(ServiceReference reference) {
return super.addingService(reference);
}
@Override
public void removedService(ServiceReference reference, Object service) {
super.removedService(reference, service);
}
}
위의 Tracker는 Runnable 인터페이스를 구현하는 서비스를 추적하게 되어있습니다. 이 외에도 getService()나 getServiceReferences() 같은 것들을 오버라이딩 할 수 있어서 중간에 반환할 구현체를 바꿔치기 (팩토리 등 구현하고 싶을 때 이용할 수 있음)하거나 다양한 트릭이 가능하지만 일단 넘어갑시다..
하여간 위의 tracker 인스턴스를 생성해서 open()을 호출하게 되면 그 때부터 Runnable 인터페이스를 구현하는 서비스가 서비스 레지스트리에 등록될 때마다 addingService()로 이벤트를 받을 수 있고, removedService()로 서비스 레지스트리에서 서비스가 등록 해제될 때마다 이벤트를 받을 수 있습니다.
OSGi 환경에서는 이런 식으로 뭔가가 등록될 때 이벤트를 받아서 자신과 관련있는지 조사하고 자동으로 관련 작업을 수행하도록 만드는게 일반적인 개발 패턴입니다. (위의 예처럼 Runnable 서비스가 등록되면 자동으로 스케줄 예약 한다든가..) 서비스 등록 이벤트 외에도 번들 이벤트를 처리할 수도 있을텐데.. 가령 iPOJO의 경우 번들 시작 이벤트를 받게 되면 번들의 MANIFEST를 조사해서 iPOJO 전용 메타데이터가 있는 경우 컴포넌트 인스턴스를 자동으로 생성하는 과정을 거치게 되지요..
동일한 패턴으로 서블릿이 서비스 레지스트리에 등록되게 되면 크라켄 HTTP가 서비스 등록 이벤트를 받아서 웹 서버에 자동으로 서블릿을 연결하게 되고 바로 웹 서비스 받을 수 있는 상태가 되지요.
동일한 패턴으로 ESM 관련해서 로그 수집 서비스가 서비스 레지스트리에 등록되게 되면 자동으로 로그 라우터에 연결되고 로그가 흘러들어가게 되죠.. 그 이후에는 등록된 로그 핸들러들이 줄줄이 호출되고, 받은 로그를 DB에 저장하든 통계를 내든 개발자 마음대로 하면 되겠죠.
크라켄 플랫폼과 기존 개발된 번들들을 활용하면 응용 모듈 개발은 최소한의 코드로 할 수 있고 배포도 거의 자동으로 되니 개발을 날로 먹을 수 있게 된다 뭐 그런 얘기가 되겠습니다..




