2012-03-18 5 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を設定するには、データベースドライバのクラス名を使用したとレガシーaproachがうまく動作しません。 OSGiで。

データソースを初期化してサービスとして提供するアクティベータを使用してバンドルを作成する必要がありますか?

答えて

1

あなたは混乱していると思います。上記のコードはJDBCドライバを使用していません。 JDBCデータソースをサービスとして使用しています。 GlassFishでは、DataSourceサービスを作成する最も簡単な方法は、 "asadmin create-jdbc-resource with JNDI name"のようなGlassFish管理操作を使用することです。その後、GlassFishは自動的にそれをDataSource OSGiサービスとして登録プロパティjndi-name = YourSuppliedJndiNameで登録します。

+0

だから、このコードは正しいですか? –

+0

はい、上記のコードでは、主な関心事であったJDBCドライバを直接使用していないため、この点については正しいです。疑わしいコードの部分があることは別の問題です。例えば、所望のDataSourceサービスが利用可能になったときに新しいSessionHandleサービスを登録しているが、前記サービスが消滅したときにそのサービスを登録解除していないとする。理想的には、registerServiceをサービストラッカーのフィールドとして作成し、サービストラッカーのremovedService()メソッドでregisterServiceを登録解除できるようにするのが理想的です。 – sahoo

+0

コードを修正しますか? www.http://pastebin.com/でアップロードしてください。シンプルなアクティベータを作成できますが、これに対しては正しいものにするための知識が不足しています。 –

1

Gemini DBAccess projectにチェックを入れて、OSGiサービスとしてDataSourceFactoryをエクスポートするだけで使用できます。

+0

この例はGemini DBAccessから見つかりました:http://pastebin.com/S8rvbNhZ Apache Felixで実装するのが難しいことがわかりました。私はOSGIに十分な練習がありません。 –

関連する問題