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

クラス

class  CacheEntryListener
 
class  HotRodListener
 

静的公開メンバ関数

static InfinispanNotificationsManager create (KeycloakSession session, Cache< String, Serializable > workCache, String myAddress, String mySite, Set< RemoteStore > remoteStores)
 

限定公開メンバ関数

 InfinispanNotificationsManager (Cache< String, Serializable > workCache, RemoteCache workRemoteCache, String myAddress, String mySite, ExecutorService listenersExecutor)
 

静的限定公開変数類

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

関数

void registerListener (String taskKey, ClusterListener task)
 
TaskCallback registerTaskCallback (String taskKey, TaskCallback callback)
 
void notify (String taskKey, ClusterEvent event, boolean ignoreSender, ClusterProvider.DCNotify dcNotify)
 
void taskFinished (String taskKey, boolean success)
 

非公開メンバ関数

void eventReceived (String key, Serializable obj)
 

非公開変数類

final ConcurrentMultivaluedHashMap< String, ClusterListenerlisteners = new ConcurrentMultivaluedHashMap<>()
 
final ConcurrentMap< String, TaskCallbacktaskCallbacks = new ConcurrentHashMap<>()
 
final Cache< String, Serializable > workCache
 
final RemoteCache workRemoteCache
 
final String myAddress
 
final String mySite
 
final ExecutorService listenersExecutor
 

詳解

Impl for sending infinispan messages across cluster and listening to them

著者
Marek Posolda

構築子と解体子

◆ InfinispanNotificationsManager()

org.keycloak.cluster.infinispan.InfinispanNotificationsManager.InfinispanNotificationsManager ( Cache< String, Serializable >  workCache,
RemoteCache  workRemoteCache,
String  myAddress,
String  mySite,
ExecutorService  listenersExecutor 
)
inlineprotected
82  {
83  this.workCache = workCache;
85  this.myAddress = myAddress;
86  this.mySite = mySite;
88  }
final String myAddress
Definition: InfinispanNotificationsManager.java:75
final String mySite
Definition: InfinispanNotificationsManager.java:77
final ExecutorService listenersExecutor
Definition: InfinispanNotificationsManager.java:79
final Cache< String, Serializable > workCache
Definition: InfinispanNotificationsManager.java:71
final RemoteCache workRemoteCache
Definition: InfinispanNotificationsManager.java:73

関数詳解

◆ create()

static InfinispanNotificationsManager org.keycloak.cluster.infinispan.InfinispanNotificationsManager.create ( KeycloakSession  session,
Cache< String, Serializable >  workCache,
String  myAddress,
String  mySite,
Set< RemoteStore >  remoteStores 
)
inlinestatic
92  {
93  RemoteCache workRemoteCache = null;
94 
95  if (!remoteStores.isEmpty()) {
96  RemoteStore remoteStore = remoteStores.iterator().next();
97  workRemoteCache = remoteStore.getRemoteCache();
98 
99  if (mySite == null) {
100  throw new IllegalStateException("Multiple datacenters available, but site name is not configured! Check your configuration");
101  }
102  }
103 
104  ExecutorService listenersExecutor = workRemoteCache==null ? null : session.getProvider(ExecutorsProvider.class).getExecutor("work-cache-event-listener");
105  InfinispanNotificationsManager manager = new InfinispanNotificationsManager(workCache, workRemoteCache, myAddress, mySite, listenersExecutor);
106 
107  // We need CacheEntryListener for communication within current DC
108  workCache.addListener(manager.new CacheEntryListener());
109  logger.debugf("Added listener for infinispan cache: %s", workCache.getName());
110 
111  // Added listener for remoteCache to notify other DCs
112  if (workRemoteCache != null) {
113  workRemoteCache.addClientListener(manager.new HotRodListener(workRemoteCache));
114  logger.debugf("Added listener for HotRod remoteStore cache: %s", workRemoteCache.getName());
115  }
116 
117  return manager;
118  }
final String myAddress
Definition: InfinispanNotificationsManager.java:75
final String mySite
Definition: InfinispanNotificationsManager.java:77
final ExecutorService listenersExecutor
Definition: InfinispanNotificationsManager.java:79
final Cache< String, Serializable > workCache
Definition: InfinispanNotificationsManager.java:71
InfinispanNotificationsManager(Cache< String, Serializable > workCache, RemoteCache workRemoteCache, String myAddress, String mySite, ExecutorService listenersExecutor)
Definition: InfinispanNotificationsManager.java:82
final RemoteCache workRemoteCache
Definition: InfinispanNotificationsManager.java:73
static final Logger logger
Definition: InfinispanNotificationsManager.java:65

◆ eventReceived()

void org.keycloak.cluster.infinispan.InfinispanNotificationsManager.eventReceived ( String  key,
Serializable  obj 
)
inlineprivate
246  {
247  if (!(obj instanceof WrapperClusterEvent)) {
248  if (obj == null) {
249  logger.warnf("Event object wasn't available in remote cache after event was received. Event key: %s", key);
250  }
251  return;
252  }
253 
254  WrapperClusterEvent event = (WrapperClusterEvent) obj;
255 
256  if (event.isIgnoreSender()) {
257  if (this.myAddress.equals(event.getSender())) {
258  return;
259  }
260  }
261 
262  if (event.isIgnoreSenderSite()) {
263  if (this.mySite == null || this.mySite.equals(event.getSenderSite())) {
264  return;
265  }
266  }
267 
268  String eventKey = event.getEventKey();
269 
270  if (logger.isTraceEnabled()) {
271  logger.tracef("Received event: %s", event);
272  }
273 
274  ClusterEvent wrappedEvent = event.getDelegateEvent();
275 
276  List<ClusterListener> myListeners = listeners.get(eventKey);
277  if (myListeners != null) {
278  for (ClusterListener listener : myListeners) {
279  listener.eventReceived(wrappedEvent);
280  }
281  }
282  }
final String myAddress
Definition: InfinispanNotificationsManager.java:75
final String mySite
Definition: InfinispanNotificationsManager.java:77
final ConcurrentMultivaluedHashMap< String, ClusterListener > listeners
Definition: InfinispanNotificationsManager.java:67
static final Logger logger
Definition: InfinispanNotificationsManager.java:65

◆ notify()

void org.keycloak.cluster.infinispan.InfinispanNotificationsManager.notify ( String  taskKey,
ClusterEvent  event,
boolean  ignoreSender,
ClusterProvider.DCNotify  dcNotify 
)
inlinepackage
137  {
138  WrapperClusterEvent wrappedEvent = new WrapperClusterEvent();
139  wrappedEvent.setEventKey(taskKey);
140  wrappedEvent.setDelegateEvent(event);
141  wrappedEvent.setIgnoreSender(ignoreSender);
142  wrappedEvent.setIgnoreSenderSite(dcNotify == ClusterProvider.DCNotify.ALL_BUT_LOCAL_DC);
143  wrappedEvent.setSender(myAddress);
144  wrappedEvent.setSenderSite(mySite);
145 
146  String eventKey = UUID.randomUUID().toString();
147 
148  if (logger.isTraceEnabled()) {
149  logger.tracef("Sending event with key %s: %s", eventKey, event);
150  }
151 
152  if (dcNotify == ClusterProvider.DCNotify.LOCAL_DC_ONLY || workRemoteCache == null) {
153  // Just put it to workCache, but skip notifying remoteCache
154  workCache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES, Flag.SKIP_CACHE_STORE)
155  .put(eventKey, wrappedEvent, 120, TimeUnit.SECONDS);
156  } else {
157  // Add directly to remoteCache. Will notify remote listeners on all nodes in all DCs
158  Retry.executeWithBackoff((int iteration) -> {
159  try {
160  workRemoteCache.put(eventKey, wrappedEvent, 120, TimeUnit.SECONDS);
161  } catch (HotRodClientException re) {
162  if (logger.isDebugEnabled()) {
163  logger.debugf(re, "Failed sending notification to remote cache '%s'. Key: '%s', iteration '%s'. Will try to retry the task",
164  workRemoteCache.getName(), eventKey, iteration);
165  }
166 
167  // Rethrow the exception. Retry will take care of handle the exception and eventually retry the operation.
168  throw re;
169  }
170 
171  }, 10, 10);
172 
173  }
174  }
final String myAddress
Definition: InfinispanNotificationsManager.java:75
final String mySite
Definition: InfinispanNotificationsManager.java:77
final Cache< String, Serializable > workCache
Definition: InfinispanNotificationsManager.java:71
final RemoteCache workRemoteCache
Definition: InfinispanNotificationsManager.java:73
static final Logger logger
Definition: InfinispanNotificationsManager.java:65

◆ registerListener()

void org.keycloak.cluster.infinispan.InfinispanNotificationsManager.registerListener ( String  taskKey,
ClusterListener  task 
)
inlinepackage
121  {
122  listeners.add(taskKey, task);
123  }
final ConcurrentMultivaluedHashMap< String, ClusterListener > listeners
Definition: InfinispanNotificationsManager.java:67

◆ registerTaskCallback()

TaskCallback org.keycloak.cluster.infinispan.InfinispanNotificationsManager.registerTaskCallback ( String  taskKey,
TaskCallback  callback 
)
inlinepackage
126  {
127  TaskCallback existing = taskCallbacks.putIfAbsent(taskKey, callback);
128 
129  if (existing != null) {
130  return existing;
131  } else {
132  return callback;
133  }
134  }
final ConcurrentMap< String, TaskCallback > taskCallbacks
Definition: InfinispanNotificationsManager.java:69

◆ taskFinished()

void org.keycloak.cluster.infinispan.InfinispanNotificationsManager.taskFinished ( String  taskKey,
boolean  success 
)
inlinepackage
285  {
286  TaskCallback callback = taskCallbacks.remove(taskKey);
287 
288  if (callback != null) {
289  if (logger.isDebugEnabled()) {
290  logger.debugf("Finished task '%s' with '%b'", taskKey, success);
291  }
292  callback.setSuccess(success);
293  callback.getTaskCompletedLatch().countDown();
294  }
295 
296  }
final ConcurrentMap< String, TaskCallback > taskCallbacks
Definition: InfinispanNotificationsManager.java:69
static final Logger logger
Definition: InfinispanNotificationsManager.java:65

メンバ詳解

◆ listeners

final ConcurrentMultivaluedHashMap<String, ClusterListener> org.keycloak.cluster.infinispan.InfinispanNotificationsManager.listeners = new ConcurrentMultivaluedHashMap<>()
private

◆ listenersExecutor

final ExecutorService org.keycloak.cluster.infinispan.InfinispanNotificationsManager.listenersExecutor
private

◆ logger

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

◆ myAddress

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

◆ mySite

final String org.keycloak.cluster.infinispan.InfinispanNotificationsManager.mySite
private

◆ taskCallbacks

final ConcurrentMap<String, TaskCallback> org.keycloak.cluster.infinispan.InfinispanNotificationsManager.taskCallbacks = new ConcurrentHashMap<>()
private

◆ workCache

final Cache<String, Serializable> org.keycloak.cluster.infinispan.InfinispanNotificationsManager.workCache
private

◆ workRemoteCache

final RemoteCache org.keycloak.cluster.infinispan.InfinispanNotificationsManager.workRemoteCache
private

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