Хобрук: Ваш путь к мастерству в программировании

GlassFish - Как получить источник данных из пакета OSGI

У меня есть этот активатор 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.

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


Ответы:


1

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

19.03.2012
  • Да, приведенный выше код не использует драйвер JDBC напрямую, что было вашей основной задачей, поэтому в этом отношении это правильно. Другое дело, что некоторые части кода выглядят подозрительно. например, вы регистрируете новую службу SessionHandle, когда желаемая служба DataSource становится доступной, но вы не отменяете ее регистрацию, когда указанная служба исчезает. В идеале вы должны сделать registerService полем средства отслеживания служб, чтобы вы могли отменить его регистрацию в методе removeService() средства отслеживания служб. 20.03.2012
  • Не могли бы вы исправить код? Загрузите его на www.pastebin.com Я могу создать простой активатор, но для этого у меня недостаточно знаний, чтобы сделай это правильно. 20.03.2012

  • 2

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

    18.03.2012
  • Я нашел этот пример в Gemini DBAccess: pastebin.com/S8rvbNhZ. Мне было трудно реализовать его с помощью Apache Felix. У меня недостаточно практики с OSGI. 18.03.2012
  • Новые материалы

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..

    Случай использования npm3 вместо npm2 для разработки библиотеки
    Некоторое время назад я создал библиотеку на NodeJS, чтобы упростить рендеринг на стороне сервера и клиента. Он использует React и React Router для отображения соответствующего HTML на веб-сайте...

    Локаджит, спасибо, что поделились этой точкой зрения.
    Локаджит, спасибо, что поделились этой точкой зрения. «Вы становитесь сильными, поднимая других, а не опуская их». Мы все можем извлечь уроки из этой цитаты.

    Как простая библиотека может повысить производительность вашего приложения React
    Знакомство с Million.js Виртуальный DOM React не такой быстрый. Но мы не можем обойти это. Если мы хотим React, нам нужно его придерживаться, верно? Нет, есть альтернатива. Million —..