我有這樣的Apache菲利克斯活化劑,其獲取數據源服務:GlassFish的 - 如何從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);
}
}
該解決方案的工作,但傳統的形式給出了使用數據庫驅動程序類名來配置JDBC不能很好地工作在OSGi。
我該如何寫一個激活器來初始化數據源並將其作爲服務提供?
那麼這段代碼是正確的? – 2012-03-19 16:55:08
是的,上面的代碼並不直接使用JDBC驅動程序,這是您主要關心的問題,所以在這方面它是正確的。這是一個不同的問題,有代碼的一些部分看起來很可疑。例如,當所需的DataSource服務可用時,您正在註冊新的SessionHandle服務,但是當所述服務消失時,您不註銷它。理想情況下,您應該將registerService作爲服務跟蹤器的一個字段,以便您可以在服務跟蹤器的removedService()方法中註銷它。 – sahoo 2012-03-20 04:40:06
你會更正代碼嗎?上傳它在www.http://pastebin.com/我可以創建一個簡單的激活器,但爲此,我沒有足夠的知識來使其正確。 – 2012-03-20 07:45:47