GlassFish - Как получить источник данных из комплекта OSGI - PullRequest
2 голосов
/ 18 марта 2012

У меня есть активатор Apache Felix, который получает службу источника данных:

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.

Как мне написать пакет с активатором, который инициализирует источник данных и предлагает его в качестве службы?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я думаю, что вы в замешательстве. Приведенный выше код не использует драйвер JDBC. Он использует источник данных JDBC в качестве службы. В GlassFish самый простой способ создания службы DataSource - использовать операцию администрирования GlassFish, например «asadmin create-jdbc-resource с именем JNDI». Затем GlassFish автоматически регистрирует его в качестве службы OSGi DataSource со свойством регистрации jndi-name = YourSuppliedJndiName.

1 голос
/ 18 марта 2012

Вы можете проверить Проект Gemini DBAccess , он экспортирует DataSourceFactory в качестве службы OSGi, поэтому вы можете просто использовать его.

...