Map管理操作触发器
Map触发补充标准的Oracle Coherence的能力,以提供高度自定义的缓存管理系统。例如,地图触发器可以防止非法交易,执行复杂安全授权或复杂的业务规则,提供透明的事件日志和审计,并收集统计数据修改。触发器的其他可能用途,包括限制行动,打击一个缓存,在应用程序重新部署时间发出。
例如,假设你有代码是与NamedCache工作,条目插入地图之前,你想改变一个条目的行为或内容。除了地图触发,而无需修改现有的代码,使你做出这种改变。
地图触发器也可以作为升级过程的一部分。除了地图触发提示插入被转移到另一个从一个缓存。
Oracle Coherence的高速缓存中的地图触发有点类似一个可能应用到数据库的触发器。是运行响应存在挂起的更改(或删除)的对应的映射项的MapTrigger接口所表示的官能剂。未处理的更改表示由MapTrigger.Entry接口。这个接口继承自的InvocableMap.Entry接口,所以它提供的方法来检索,更新和删除值在基础地图。
的MapTrigger接口包含的工艺方法,用于验证,拒绝或修改地图中的挂起的更改。这种方法被称为致力于在行动前,打算改变底层的地图内容。实施这种方法可以评估待通过分析原有的和新的价值变化,并产生以下结果:
覆盖要求的变化具有不同的值
撤消挂起的更改原来的值复位
删除该条目从底层地图
通过抛出一个RuntimeException拒绝挂起的更改
什么也不做,并允许未决更改承诺
MapTrigger功能通常添加应用程序启动过程的一部分。可以以编程方式添加的MapTrigger API中所描述的,或使用的连贯性高速缓存-config.xml配置文件中的类工厂机制,它可以被配置。在这种情况下, MapTrigger注册期间第一CacheFactory.getCache ( ... )调用相应的缓存。例25-1假设的createMapTrigger方法会返回一个new MapTriggerListener(new MyCustomTrigger());:
例25-1例MapTriggerListener配置
<distributed-scheme>
...
<listener>
<class-scheme>
<class-factory-name>package.MyFactory</class-factory-name>
<method-name>createTriggerListener</method-name>
<init-params>
<init-param>
<param-type>string</param-type>
<param-value>{cache-name}</param-value>
</init-param>
</init-params>
</class-scheme>
</listener>
</distributed-scheme>
Oracle Coherence的在除了向MapTrigger.Entry MapTrigger接口,提供了FilterTrigger和MapTriggerListener类。 FilterTrigger是一个通用MapTrigger ,实现,执行预定义的动作,如果相关的过滤器挂起的更改被拒绝。该FilterTrigger可以拒绝挂起的操作,忽略的变化,恢复条目的原始值,或删除条目本身从底层地图。
MapTriggerListener ,用于注册与相应的NamedCache的MapTrigger的特殊目的MapListener的实施。例25-2 , MapTriggerListener与人民的命名缓存是用来注册PersonMapTrigger 。
例25-2 à MapTriggerListener注册MapTrigger的命名高速缓存
NamedCache person = CacheFactory.getCache("People"); MapTrigger trigger = new PersonMapTrigger(); person.addMapListener(new MapTriggerListener(trigger)); |
这些API驻留在com.tangosol.util包中。这些API的更多信息,请参阅Javadoc页MapTrigger , MapTrigger.Entry , FilterTrigger , MapTriggerListener 。
25.1一个Map 触发的例子
例25-3中的代码说明地图触发,它可以被称为。在例25-3中的的PersonMapTrigger类,该处理方法实施修改条目之前,它被放置在地图里。在这种情况下,最后一个Person对象的name属性转换为大写字符。条目,然后返回到该对象。
例25-3一个MapTrigger类
... public class PersonMapTrigger implements MapTrigger { public PersonMapTrigger() { } public void process(MapTrigger.Entry entry) { Person person = (Person) entry.getValue(); String sName = person.getLastName(); String sNameUC = sName.toUpperCase(); if (!sNameUC.equals(sName)) { person.setLastName(sNameUC); System.out.println("Changed last name of [" + sName + "] to [" + person.getLastName() + "]"); entry.setValue(person); } } // ---- hashCode() and equals() must be implemented public boolean equals(Object o) { return o != null && o.getClass() == this.getClass(); } public int hashCode() { return getClass().getName().hashCode(); } } |
例25-4 MapTrigger ,调用的PersonMapTrigger 。新MapTriggerListener的PersonMapTrigger传递人民NamedCache 。
例25-4调用一个MapTrigger和传递到命名高速缓存
... public class MyFactory { /** * Instantiate a MapTriggerListener for a given NamedCache */ public static MapTriggerListener createTriggerListener(String sCacheName) { MapTrigger trigger; if ("People".equals(sCacheName)) { trigger = new PersonMapTrigger(); } else { throw IllegalArgumentException("Unknown cache name " + sCacheName); } System.out.println("Creating MapTrigger for cache " + sCacheName); return new MapTriggerListener(trigger); } public static void main(String[] args) { NamedCache cache = CacheFactory.getCache("People"); cache.addMapListener(createTriggerListener("People")); System.out.println("Installed MapTrigger into cache People"); } } |