keycloak
公開メンバ関数 | 静的公開変数類 | 静的限定公開変数類 | 関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.cluster.infinispan.InfinispanClusterProvider クラス
org.keycloak.cluster.infinispan.InfinispanClusterProvider の継承関係図
Inheritance graph
org.keycloak.cluster.infinispan.InfinispanClusterProvider 連携図
Collaboration graph

公開メンバ関数

 InfinispanClusterProvider (int clusterStartupTime, String myAddress, CrossDCAwareCacheFactory crossDCAwareCacheFactory, InfinispanNotificationsManager notificationsManager, ExecutorService localExecutor)
 
int getClusterStartupTime ()
 
void close ()
 
Future< Boolean > executeIfNotExecutedAsync (String taskKey, int taskTimeoutInSeconds, Callable task)
 
void registerListener (String taskKey, ClusterListener task)
 
void notify (String taskKey, ClusterEvent event, boolean ignoreSender, DCNotify dcNotify)
 

静的公開変数類

static final String CLUSTER_STARTUP_TIME_KEY = "cluster-start-time"
 

静的限定公開変数類

static final Logger logger = Logger.getLogger(InfinispanClusterProvider.class)
 

関数

public< T > ExecutionResult< T > executeIfNotExecuted (String taskKey, int taskTimeoutInSeconds, Callable< T > task)
 

非公開メンバ関数

LockEntry createLockEntry ()
 
boolean tryLock (String cacheKey, int taskTimeoutInSeconds)
 
void removeFromCache (String cacheKey)
 

非公開変数類

final int clusterStartupTime
 
final String myAddress
 
final CrossDCAwareCacheFactory crossDCAwareCacheFactory
 
final InfinispanNotificationsManager notificationsManager
 
final ExecutorService localExecutor
 

静的非公開変数類

static final String TASK_KEY_PREFIX = "task::"
 

詳解

著者
Marek Posolda

構築子と解体子

◆ InfinispanClusterProvider()

org.keycloak.cluster.infinispan.InfinispanClusterProvider.InfinispanClusterProvider ( int  clusterStartupTime,
String  myAddress,
CrossDCAwareCacheFactory  crossDCAwareCacheFactory,
InfinispanNotificationsManager  notificationsManager,
ExecutorService  localExecutor 
)
inline
51  {
52  this.myAddress = myAddress;
57  }
final InfinispanNotificationsManager notificationsManager
Definition: InfinispanClusterProvider.java:47
final ExecutorService localExecutor
Definition: InfinispanClusterProvider.java:49
final int clusterStartupTime
Definition: InfinispanClusterProvider.java:44
final CrossDCAwareCacheFactory crossDCAwareCacheFactory
Definition: InfinispanClusterProvider.java:46
final String myAddress
Definition: InfinispanClusterProvider.java:45

関数詳解

◆ close()

void org.keycloak.cluster.infinispan.InfinispanClusterProvider.close ( )
inline

org.keycloak.provider.Providerを実装しています。

67  {
68  }

◆ createLockEntry()

LockEntry org.keycloak.cluster.infinispan.InfinispanClusterProvider.createLockEntry ( )
inlineprivate
133  {
134  LockEntry lock = new LockEntry();
135  lock.setNode(myAddress);
136  lock.setTimestamp(Time.currentTime());
137  return lock;
138  }
final String myAddress
Definition: InfinispanClusterProvider.java:45

◆ executeIfNotExecuted()

public<T> ExecutionResult<T> org.keycloak.cluster.infinispan.InfinispanClusterProvider.executeIfNotExecuted ( String  taskKey,
int  taskTimeoutInSeconds,
Callable< T >  task 
)
inlinepackage

org.keycloak.cluster.ClusterProviderを実装しています。

72  {
73  String cacheKey = TASK_KEY_PREFIX + taskKey;
74  boolean locked = tryLock(cacheKey, taskTimeoutInSeconds);
75  if (locked) {
76  try {
77  try {
78  T result = task.call();
79  return ExecutionResult.executed(result);
80  } catch (RuntimeException re) {
81  throw re;
82  } catch (Exception e) {
83  throw new RuntimeException("Unexpected exception when executed task " + taskKey, e);
84  }
85  } finally {
86  removeFromCache(cacheKey);
87  }
88  } else {
89  return ExecutionResult.notExecuted();
90  }
91  }
static final String TASK_KEY_PREFIX
Definition: InfinispanClusterProvider.java:42
boolean tryLock(String cacheKey, int taskTimeoutInSeconds)
Definition: InfinispanClusterProvider.java:141
void removeFromCache(String cacheKey)
Definition: InfinispanClusterProvider.java:159

◆ executeIfNotExecutedAsync()

Future<Boolean> org.keycloak.cluster.infinispan.InfinispanClusterProvider.executeIfNotExecutedAsync ( String  taskKey,
int  taskTimeoutInSeconds,
Callable  task 
)
inline

org.keycloak.cluster.ClusterProviderを実装しています。

95  {
96  TaskCallback newCallback = new TaskCallback();
97  TaskCallback callback = this.notificationsManager.registerTaskCallback(TASK_KEY_PREFIX + taskKey, newCallback);
98 
99  // We successfully submitted our task
100  if (newCallback == callback) {
101  Callable<Boolean> wrappedTask = () -> {
102  boolean executed = executeIfNotExecuted(taskKey, taskTimeoutInSeconds, task).isExecuted();
103 
104  if (!executed) {
105  logger.infof("Task already in progress on other cluster node. Will wait until it's finished");
106  }
107 
108  callback.getTaskCompletedLatch().await(taskTimeoutInSeconds, TimeUnit.SECONDS);
109  return callback.isSuccess();
110  };
111 
112  Future<Boolean> future = localExecutor.submit(wrappedTask);
113  callback.setFuture(future);
114  } else {
115  logger.infof("Task already in progress on this cluster node. Will wait until it's finished");
116  }
117 
118  return callback.getFuture();
119  }
final InfinispanNotificationsManager notificationsManager
Definition: InfinispanClusterProvider.java:47
static final Logger logger
Definition: InfinispanClusterProvider.java:39
public< T > ExecutionResult< T > executeIfNotExecuted(String taskKey, int taskTimeoutInSeconds, Callable< T > task)
Definition: InfinispanClusterProvider.java:72
final ExecutorService localExecutor
Definition: InfinispanClusterProvider.java:49
static final String TASK_KEY_PREFIX
Definition: InfinispanClusterProvider.java:42
TaskCallback registerTaskCallback(String taskKey, TaskCallback callback)
Definition: InfinispanNotificationsManager.java:126

◆ getClusterStartupTime()

int org.keycloak.cluster.infinispan.InfinispanClusterProvider.getClusterStartupTime ( )
inline

org.keycloak.cluster.ClusterProviderを実装しています。

61  {
62  return clusterStartupTime;
63  }
final int clusterStartupTime
Definition: InfinispanClusterProvider.java:44

◆ notify()

void org.keycloak.cluster.infinispan.InfinispanClusterProvider.notify ( String  taskKey,
ClusterEvent  event,
boolean  ignoreSender,
DCNotify  dcNotify 
)
inline

org.keycloak.cluster.ClusterProviderを実装しています。

129  {
130  this.notificationsManager.notify(taskKey, event, ignoreSender, dcNotify);
131  }
final InfinispanNotificationsManager notificationsManager
Definition: InfinispanClusterProvider.java:47
void notify(String taskKey, ClusterEvent event, boolean ignoreSender, ClusterProvider.DCNotify dcNotify)
Definition: InfinispanNotificationsManager.java:137

◆ registerListener()

void org.keycloak.cluster.infinispan.InfinispanClusterProvider.registerListener ( String  taskKey,
ClusterListener  task 
)
inline

org.keycloak.cluster.ClusterProviderを実装しています。

123  {
124  this.notificationsManager.registerListener(taskKey, task);
125  }
final InfinispanNotificationsManager notificationsManager
Definition: InfinispanClusterProvider.java:47
void registerListener(String taskKey, ClusterListener task)
Definition: InfinispanNotificationsManager.java:121

◆ removeFromCache()

void org.keycloak.cluster.infinispan.InfinispanClusterProvider.removeFromCache ( String  cacheKey)
inlineprivate
159  {
160  // More attempts to send the message (it may fail if some node fails in the meantime)
161  Retry.executeWithBackoff((int iteration) -> {
162 
163  crossDCAwareCacheFactory.getCache().remove(cacheKey);
164  if (logger.isTraceEnabled()) {
165  logger.tracef("Task %s removed from the cache", cacheKey);
166  }
167 
168  }, 10, 10);
169  }
static final Logger logger
Definition: InfinispanClusterProvider.java:39
abstract BasicCache< String, Serializable > getCache()
final CrossDCAwareCacheFactory crossDCAwareCacheFactory
Definition: InfinispanClusterProvider.java:46

◆ tryLock()

boolean org.keycloak.cluster.infinispan.InfinispanClusterProvider.tryLock ( String  cacheKey,
int  taskTimeoutInSeconds 
)
inlineprivate
141  {
142  LockEntry myLock = createLockEntry();
143 
144  LockEntry existingLock = InfinispanClusterProviderFactory.putIfAbsentWithRetries(crossDCAwareCacheFactory, cacheKey, myLock, taskTimeoutInSeconds);
145  if (existingLock != null) {
146  if (logger.isTraceEnabled()) {
147  logger.tracef("Task %s in progress already by node %s. Ignoring task.", cacheKey, existingLock.getNode());
148  }
149  return false;
150  } else {
151  if (logger.isTraceEnabled()) {
152  logger.tracef("Successfully acquired lock for task %s. Our node is %s", cacheKey, myLock.getNode());
153  }
154  return true;
155  }
156  }
LockEntry createLockEntry()
Definition: InfinispanClusterProvider.java:133
static final Logger logger
Definition: InfinispanClusterProvider.java:39
final CrossDCAwareCacheFactory crossDCAwareCacheFactory
Definition: InfinispanClusterProvider.java:46

メンバ詳解

◆ CLUSTER_STARTUP_TIME_KEY

final String org.keycloak.cluster.infinispan.InfinispanClusterProvider.CLUSTER_STARTUP_TIME_KEY = "cluster-start-time"
static

◆ clusterStartupTime

final int org.keycloak.cluster.infinispan.InfinispanClusterProvider.clusterStartupTime
private

◆ crossDCAwareCacheFactory

final CrossDCAwareCacheFactory org.keycloak.cluster.infinispan.InfinispanClusterProvider.crossDCAwareCacheFactory
private

◆ localExecutor

final ExecutorService org.keycloak.cluster.infinispan.InfinispanClusterProvider.localExecutor
private

◆ logger

final Logger org.keycloak.cluster.infinispan.InfinispanClusterProvider.logger = Logger.getLogger(InfinispanClusterProvider.class)
staticprotected

◆ myAddress

final String org.keycloak.cluster.infinispan.InfinispanClusterProvider.myAddress
private

◆ notificationsManager

final InfinispanNotificationsManager org.keycloak.cluster.infinispan.InfinispanClusterProvider.notificationsManager
private

◆ TASK_KEY_PREFIX

final String org.keycloak.cluster.infinispan.InfinispanClusterProvider.TASK_KEY_PREFIX = "task::"
staticprivate

このクラス詳解は次のファイルから抽出されました: