나는 데이터 소스 서비스를 얻을이 아파치 펠릭스 활성제가 : 잘 작동하지 않습니다 JDBC를 구성하는 데이터베이스 드라이버 클래스 이름을 사용하여글래스 피쉬 - OSGI 번들에서 데이터 소스를 얻는 방법
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;
import org.DX_57.osgi.SH_27.api.SessionHandle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
public class SessionHandleApp implements BundleActivator {
public static final String DSNAME = "jdbc/Oracle";
public ServiceTracker st;
@Override
public void start(final BundleContext bc) throws Exception {
debug("Activator started");
Filter filter = bc.createFilter("(&" + "(" + Constants.OBJECTCLASS
+ "=" + DataSource.class.getName() + ")" + "(jndi-name="
+ DSNAME + ")" + ")");
st = new ServiceTracker(bc, filter, null) {
@Override
public Object addingService(ServiceReference reference) {
DataSource ds = (DataSource) bc.getService(reference);
try {
debug(ds.getConnection().toString());
SessionHandle sh = new SessionHandleImpl();
sh.setDataSource(ds);
ServiceRegistration registerService = bc.registerService(SessionHandle.class.getName(), sh, new Properties());
} catch (SQLException e) {
}
return super.addingService(reference);
}
@Override
public void removedService(ServiceReference reference,
Object service) {
super.removedService(reference, service);
}
};
st.open();
}
public void stop(BundleContext bc) throws Exception {
boolean ungetService = bc.ungetService(bc.getServiceReference(SessionHandle.class.getName()));
st.close();
}
private void debug(String msg) {
System.out.println("JDBCBundleActivator: " + msg);
}
}
이 솔루션은 작동하지만 기존 aproach을 OSGi에서.
데이터 소스를 초기화하고 서비스로 제공하는 활성자를 사용하여 번들을 작성해야하는 방법은 무엇입니까?
그럼이 코드는 맞습니까? –
예, 위 코드는 JDBC 드라이버를 직접적으로 사용하지 않으므로이 점에있어서 정확합니다. 의심스러운 코드의 일부가 존재한다는 것은 다른 문제입니다. 예를 들어 원하는 DataSource 서비스를 사용할 수있게되었을 때 새로운 SessionHandle 서비스를 등록하고 있지만 해당 서비스가 사라지면 등록을 취소하지 않는 것입니다. 이상적으로는 서비스 추적 프로그램의 removedService() 메소드에서 registerService를 등록 취소 할 수 있도록 registerService를 서비스 추적 프로그램의 필드로 설정하는 것이 이상적입니다. – sahoo
코드를 수정 하시겠습니까? www.http : //pastebin.com/에서 업로드하십시오. 간단한 Activator를 만들 수 있습니다. 그러나이 경우 올바른 정보를 얻기에는 충분하지 않습니다. –