Модуль Java 9 / Система обслуживания - получить поставщика услуг по имени или нового, если такового нет? - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь узнать о Службах Java 9, так что это может быть не идеальный сценарий, но то, что я использую, чтобы попытаться изучить службы, в частности ...

Я пытаюсь создатьсервис для классов DatabaseConnection.Возможно, существует поставщик для MySQL, другой для SQLServer и т. Д. Приложению может потребоваться три подключения SQLServer и два подключения MySQL.Итак, для этого приложение может установить имя подключения как часть метода init.

Итак, я пытаюсь создать метод, который будет жить в интерфейсе службы и принимать два аргумента:имя соединения и ядро ​​базы данных.Он должен вернуть уже созданного экземпляра провайдера, если таковой существует, или создать нового (при условии, что определен правильный провайдер), но я не могу этого сделать.Он просто возвращает уже созданную версию.

У меня есть метод:

public static DatabaseConnection getDBCByNameEngine(String name, String dbEngine) throws NoProviderException
{
    ServiceLoader<DatabaseConnection> dbsl = ServiceLoader.load(DatabaseConnection.class);
    // See if the connection with that name exists
    for (Databaseconnection dbco : dbsl) {
        if (dbco.getName().equals(name)) return dbco;
    }
    // Create a new instance
    Optional<DatabaseConnection> dbc = dbcs.stream()
        // This filter is checking an annotation Engine(name="whatever")
        .filter(provider -> engineMatches(provider.type(), engineName);
        .map(ServiceLoader.Provider::get)
        .findFirst();
     if (dbc.isPresent()) {
         dbc.setName(name);
         return dbc;
     }
}

Я создал службу, которая является интерфейсом с именем DatabaseConnection:

public interface DatabaseConnection
{
    public static getDBCByNameEngine(String name, String dbEngine) throws NoProviderException
    {
        // see above
    }
    void init(connectionName, connectionString, String username, String password);
    String getName();
    // DB stuff
}

Что происходит, когда я вызываю метод в первый раз для поставщика SQLServer с именем conn1, я получаю новый экземпляр с именем conn1.Во второй раз, когда я вызываю поставщика SQLSerer с именем conn2, я получаю тот же экземпляр, переименованный в conn2.

...