2012-03-18 23 views
2

我有這樣的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。

我該如何寫一個激活器來初始化數據源並將其作爲服務提供?

回答

1

我覺得你很困惑。以上代碼不使用JDBC驅動程序。它使用JDBC數據源作爲服務。在GlassFish中,創建DataSource服務的最簡單方法是使用GlassFish管理操作,如「帶有JNDI名稱的asadmin create-jdbc-resource」。然後GlassFish自動將其註冊爲具有註冊屬性jndi-name = YourSuppliedJndiName的DataSource OSGi服務。

+0

那麼這段代碼是正確的? – 2012-03-19 16:55:08

+0

是的,上面的代碼並不直接使用JDBC驅動程序,這是您主要關心的問題,所以在這方面它是正確的。這是一個不同的問題,有代碼的一些部分看起來很可疑。例如,當所需的DataSource服務可用時,您正在註冊新的SessionHandle服務,但是當所述服務消失時,您不註銷它。理想情況下,您應該將registerService作爲服務跟蹤器的一個字段,以便您可以在服務跟蹤器的removedService()方法中註銷它。 – sahoo 2012-03-20 04:40:06

+0

你會更正代碼嗎?上傳它在www.http://pastebin.com/我可以創建一個簡單的激活器,但爲此,我沒有足夠的知識來使其正確。 – 2012-03-20 07:45:47

1

你可以檢查Gemini DBAccess project,它將一個DataSourceFactory作爲OSGi服務導出,所以你可以使用它。

+0

我從Gemini DBAccess中發現了這個例子:http://pastebin.com/S8rvbNhZ我發現很難用Apache Felix實現它。我對OSGI沒有足夠的練習。 – 2012-03-18 17:47:17