からデータソースを取得する私は、データ・ソースのサービスを取得し、この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を設定するには、データベースドライバのクラス名を使用したとレガシーaproachがうまく動作しません。 OSGiで。
データソースを初期化してサービスとして提供するアクティベータを使用してバンドルを作成する必要がありますか?
だから、このコードは正しいですか? –
はい、上記のコードでは、主な関心事であったJDBCドライバを直接使用していないため、この点については正しいです。疑わしいコードの部分があることは別の問題です。例えば、所望のDataSourceサービスが利用可能になったときに新しいSessionHandleサービスを登録しているが、前記サービスが消滅したときにそのサービスを登録解除していないとする。理想的には、registerServiceをサービストラッカーのフィールドとして作成し、サービストラッカーのremovedService()メソッドでregisterServiceを登録解除できるようにするのが理想的です。 – sahoo
コードを修正しますか? www.http://pastebin.com/でアップロードしてください。シンプルなアクティベータを作成できますが、これに対しては正しいものにするための知識が不足しています。 –