我有这样的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