2012-03-18 5 views
2

나는 데이터 소스 서비스를 얻을이 아파치 펠릭스 활성제가 : 잘 작동하지 않습니다 JDBC를 구성하는 데이터베이스 드라이버 클래스 이름을 사용하여글래스 피쉬 - 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); 
    } 

} 

이 솔루션은 작동하지만 기존 aproach을 OSGi에서.

데이터 소스를 초기화하고 서비스로 제공하는 활성자를 사용하여 번들을 작성해야하는 방법은 무엇입니까?

답변

1

나는 혼란 스럽다고 생각합니다. 위의 코드는 JDBC 드라이버를 사용하지 않습니다. JDBC 데이터 소스를 서비스로 사용하고 있습니다. GlassFish에서 DataSource 서비스를 만드는 가장 쉬운 방법은 "asadmin create-jdbc-resource with JNDI name"과 같은 GlassFish 관리 작업을 사용하는 것입니다. 그런 다음 GlassFish는이를 자동으로 등록 등록 정보 jndi-name = YourSuppliedJndiName으로 DataSource OSGi 서비스로 등록합니다.

+0

그럼이 코드는 맞습니까? –

+0

예, 위 코드는 JDBC 드라이버를 직접적으로 사용하지 않으므로이 점에있어서 정확합니다. 의심스러운 코드의 일부가 존재한다는 것은 다른 문제입니다. 예를 들어 원하는 DataSource 서비스를 사용할 수있게되었을 때 새로운 SessionHandle 서비스를 등록하고 있지만 해당 서비스가 사라지면 등록을 취소하지 않는 것입니다. 이상적으로는 서비스 추적 프로그램의 removedService() 메소드에서 registerService를 등록 취소 할 수 있도록 registerService를 서비스 추적 프로그램의 필드로 설정하는 것이 이상적입니다. – sahoo

+0

코드를 수정 하시겠습니까? www.http : //pastebin.com/에서 업로드하십시오. 간단한 Activator를 만들 수 있습니다. 그러나이 경우 올바른 정보를 얻기에는 충분하지 않습니다. –

1

Gemini DBAccess project을 확인하고 DataSourceFactory을 OSGi 서비스로 내 보내서 사용할 수 있습니다.

+0

Gemini DBAccess에서이 예제를 찾았습니다. http://pastebin.com/S8rvbNhZ Apache Felix에서 구현하기가 어려웠습니다. OSGI에 대한 충분한 연습이 없습니다. –