Контекст сессии#
DataGrid позволяет устанавливать пользовательские атрибуты приложения во время его выполнения. Эти атрибуты могут включать идентификатор сессии, язык приложения, имя приложения и так далее. Атрибуты устанавливаются приложением только один раз для точки входа API DataGrid (DataGrid, JDBC) и доступны на всех участвующих узлах для запросов и очередей приложений.
Интерфейс SessionContext#
SessionContext предоставляет доступ только для чтения к атрибутам приложения, которые связаны с текущей операцией. Аннотация @SessionContextProviderResource позволяет внедрить SessionContextProvider, с помощью которого можно получить SessionContext текущей операции. Пользовательские функции, например QuerySqlFunction (подробнее о ней написано в разделе «Пользовательские SQL-функции») и CacheInterceptor, могут обращаться к этим атрибутам с помощью SessionContextProvider:
/** Интерфейс `SessionContext`. Точка входа для всех атрибутов. */
public interface SessionContext {
/** @return Атрибут по имени. */
public @Nullable String getAttribute(String attrName);
}
Атрибуты приложения в QuerySqlFunction#
Пользовательские SQL-функции, например QuerySqlFunction, могут использовать атрибуты приложения, которые установлены на стороне клиента:
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 и написать обработчики, у которых есть доступ к атрибутам приложения и которые вызываются до и после основных операций кеша:
Пример
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-запросе.
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(...) с новыми параметрами:
// JDBC-соединение с сервером DataGrid.
try (Connection conn = DriverManager.getConnection(URL)) {
conn.setClientInfo("SESSION_ID", "1234");
// Пользовательский код.
}