Oracle Coherence中文教程二十五:Map管理操作触发器

来源:互联网 发布:德龙网络培训学院 编辑:程序博客网 时间:2024/05/06 00:49

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-1MapTriggerListener配置

<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接口,提供了FilterTriggerMapTriggerListener类。 FilterTrigger是一个通用MapTrigger ,实现,执行预定义的动作,如果相关的过滤器挂起的更改被拒绝。该FilterTrigger可以拒绝挂起的操作,忽略的变化,恢复条目的原始值,或删除条目本身从底层地图。

MapTriggerListener ,用于注册与相应的NamedCacheMapTrigger的特殊目的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的更多信息,请参阅JavadocMapTrigger , 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 。新MapTriggerListenerPersonMapTrigger传递人民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");

        }

    }

0 0