12.2. 缓存级别通知


缓存级别事件基于每个缓存发生,默认情况下仅在发生事件的节点中引发。在分布式缓存中,这些事件只会在受影响的数据所有者中产生。缓存级事件示例是正在添加、删除、修改等条目。这些事件触发通知到注册到特定缓存的监听程序。

有关所有缓存级别通知的完整列表 ,请参阅 org.infinispan.notifications.cachelistener.annotation 软件包中的 Javadocs,以及它们对应的方法级注释。

注意

有关 Data Grid 中可用的缓存级别通知列表,请参阅 org.infinispan.notifications.cachelistener.annotation 软件包上的 Java 文档。

集群监听程序

当需要侦听单个节点上的缓存事件时,应使用集群监听程序。

为此,需要的所有情况都设置为注解您的监听程序,如集群一样。

@Listener (clustered = true)
public class MyClusterListener { .... }
Copy to Clipboard Toggle word wrap

从非集群监听器对集群监听程序有一些限制。

  1. 集群侦听器只能侦听 @CacheEntryModified@CacheEntryCreated@CacheEntryRemoved@CacheEntryExpired 事件。请注意,这意味着对于这个监听器不会侦听任何其他类型的事件。
  2. 只有 post 事件发送到集群监听程序,pre 事件将被忽略。

事件过滤和转换

安装监听程序的节点上的所有适用事件都将提升到侦听器。可以使用 KeyFilter (只允许对键进行过滤)或 CacheEventFilter (用于过滤键、旧值、新元数据、新元数据、新元数据、新元数据)来动态过滤通过 KeyFilter (仅限键过滤)或 CacheEventFilter (用于过滤键)、旧值、新元数据、新元数据以及命令类型)来动态过滤哪些事件。

此处的示例显示了一个简单的 KeyFilter,它将仅在事件修改了仅 Me 键的条目时才会引发事件。

public class SpecificKeyFilter implements KeyFilter<String> {
    private final String keyToAccept;

    public SpecificKeyFilter(String keyToAccept) {
      if (keyToAccept == null) {
        throw new NullPointerException();
      }
      this.keyToAccept = keyToAccept;
    }

    public boolean accept(String key) {
      return keyToAccept.equals(key);
    }
}

...
cache.addListener(listener, new SpecificKeyFilter("Only Me"));
...
Copy to Clipboard Toggle word wrap

当您要以更有效的方式限制接收的事件时,这非常有用。

另外,还提供了一个 CacheEventConverter,允许在引发事件前将值转换为另一个值。这对实现值转换的任何代码模块化可能很好。

注意

当与 Cluster Listener 一起使用时,上述过滤器和转换器特别有用。这是因为过滤和转换是在事件源自而不是在事件侦听的节点中执行的。这可提供不需要在集群中复制事件(filter),甚至减少了有效负载(转换器)的好处。

初始状态事件

安装监听程序后,它只会在事件被完全安装后通知事件。

可能需要在第一次注册监听器时获取缓存内容的当前状态,方法是为缓存中的每个元素生成类型为 @CacheEntryCreated 的事件。在此初始阶段中生成的任何事件都会被排队,直到引发适当的事件为止。

注意

这目前仅适用于集群监听程序。ISPN-4608 涵盖了为非集群监听程序添加此功能。

重复事件

非事务缓存中可能会接收重复的事件。当密钥的主所有者在尝试执行写入操作(如 put )时,可能会发生这种情况。

Data Grid 在内部通过将放置操作自动发送到给定密钥的新主所有者来改变放置操作,但如果写入首次复制到备份,则不能保证。因此,超过 1 个写入事件(CacheEntryCreatedEvent,CacheEntryModifiedEventCacheEntryRemovedEvent)可以在单个操作上发送。

如果生成了多个事件,则 Data Grid 会将其标记为由 retried 命令生成的事件,以帮助用户了解何时发生这个事件,而无需留意查看更改。

@Listener
public class MyRetryListener {
  @CacheEntryModified
  public void entryModified(CacheEntryModifiedEvent event) {
    if (event.isCommandRetried()) {
      // Do something
    }
  }
}
Copy to Clipboard Toggle word wrap

另外,当使用 CacheEventFilterCacheEventConverter 时,EventType 包含一个方法 isRetry,以指示事件是因为重试而生成的。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat