2012-03-18 25 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