Контекст сессии#

DataGrid позволяет устанавливать пользовательские атрибуты приложения во время его выполнения. Эти атрибуты могут включать идентификатор сессии, язык приложения, имя приложения и так далее. Атрибуты устанавливаются приложением только один раз для точки входа API DataGrid (DataGrid, JDBC) и доступны на всех участвующих узлах для запросов и очередей приложений.

Интерфейс SessionContext#

SessionContext предоставляет доступ только для чтения к атрибутам приложения, которые связаны с текущей операцией. Аннотация @SessionContextProviderResource позволяет внедрить SessionContextProvider, с помощью которого можно получить SessionContext текущей операции. Пользовательские функции, например QuerySqlFunction (подробнее о ней написано в разделе «Пользовательские SQL-функции») и CacheInterceptor, могут обращаться к этим атрибутам с помощью SessionContextProvider:

Java#
/** Интерфейс `SessionContext`. Точка входа для всех атрибутов. */
public interface SessionContext {

    /** @return Атрибут по имени. */
    public @Nullable String getAttribute(String attrName);
}

Атрибуты приложения в QuerySqlFunction#

Пользовательские SQL-функции, например QuerySqlFunction, могут использовать атрибуты приложения, которые установлены на стороне клиента:

Java#
public class MyFunctions {

    @SessionContextProviderResource
    public SessionContextProvider sesCtxProv;

    @QuerySqlFunction
    public String sessionId() {
        return sesCtxProv.getSessionContext().getAttribute("SESSION_ID");
    }
}

Примечание

Доступ к атрибутам доступен только в движке Apache Calcite (подробнее о нем написано в разделе «Работа с SQL и Apache Calcite»). В этом случае у класса должен быть публичный конструктор без параметров.

Атрибуты приложения в CacheInterceptor#

В DataGrid есть возможность настроить пользовательский CacheInterceptor и написать обработчики, у которых есть доступ к атрибутам приложения и которые вызываются до и после основных операций кеша:

Пример
Java#
public class SessionContextCacheInterceptor implements CacheInterceptor<Integer, String> {
    /** */
    @SessionContextProviderResource
    private SessionContextProvider sesCtxPrv;

    /** */
    @Override public @Nullable String onGet(Integer key, @Nullable String val) {
        String ret = sesCtxPrv.getSessionContext().getAttribute("onGet");

        return ret == null ? val : ret + key;
    }

    /** */
    @Override public @Nullable String onBeforePut(Cache.Entry<Integer, String> entry, String newVal) {
        String ret = sesCtxPrv.getSessionContext().getAttribute("onBeforePut");

        return ret == null ? newVal : ret + entry.getKey();
    }

    /** */
    @Override public void onAfterPut(Cache.Entry<Integer, String> entry) {
        // Без операции.
    }

    /** */
    @Override public @Nullable IgniteBiTuple<Boolean, String> onBeforeRemove(Cache.Entry<Integer, String> entry) {
        String ret = sesCtxPrv.getSessionContext().getAttribute("onBeforeRemove");

        return new IgniteBiTuple<>(ret != null, entry.getValue());
    }

    /** */
    @Override public void onAfterRemove(Cache.Entry<Integer, String> entry) {
        // Без операции.
    }
}

Установка атрибутов приложения#

DataGrid#

Метод ign.withApplicationAttributes(...) возвращает новый экземпляр-обертку DataGrid, операции которого выполняются с указанными атрибутами приложения. Атрибуты передаются на удаленные узлы, которые участвуют в операции с кешем или в SQL-запросе.

Java#
try (Ignite ign = Ignition.start(ignCfg)) {

    Map<String, String> appAttrs = Map.of("SESSION_ID", "1234");

    Ignite app = ign.withApplicationAttributes(appAttrs);

    // Пользовательский код.
}

JDBC#

Стандартный JDBC-протокол предоставляет метод Connection.setClientInfo(...) для установки атрибутов клиента, которые доступны в течение всего жизненного цикла соединения. Атрибуты могут быть перезаписаны с помощью повторного вызова Connection.setClientInfo(...) с новыми параметрами:

Java#
// JDBC-соединение с сервером DataGrid.
try (Connection conn = DriverManager.getConnection(URL)) {

    conn.setClientInfo("SESSION_ID", "1234");

    // Пользовательский код.
}