天天看点

EventAction的代码编写及相关作用说明

在com.filenet.api.engine包中提供了一些与EventActions和运行在CE上非FileNet的代码相关的类和接口。此包中的六个类和六个接口中只有三个接口是可以被implement,其他都是CE内部所用。这三个接口是:DocumentClassifier、DocumentLifecycleActionHandler和EventActionHandler。对于上文所讲的subscription的配置过程,我们可以通过EventActionHandler来创建自定义的EventAction,来完成触发某事件时要执行的动作。

接口EventActionHandler提供了一个方法:void onEvent(ObjectChangeEvent event, Id subscriptionId),下面代码展示了一个自定义EventAction

import com.filenet.api.engine.EventActionHandler;
import com.filenet.api.events.*;
import com.filenet.api.property.*;
import com.filenet.api.security.*;
import com.filenet.api.util.Id;
import com.filenet.api.exception.*;
import com.filenet.api.core.*;
import com.filenet.api.collection.GroupSet;
import com.filenet.api.constants.*;
import java.util.Iterator;

public class FilterNewDocumentsEventHandler implements EventActionHandler
{
   public void onEvent(ObjectChangeEvent event, Id subId)
   {
      try
      {
         // As a best practice, fetch the persisted source object of the event, 
         // filtered on the two required properties, Owner and Name.
         ObjectStore os = event.getObjectStore();
         Id id = event.get_SourceObjectId();
         FilterElement fe = new FilterElement(null, null, null, "Owner Name", null);	
         PropertyFilter pf = new PropertyFilter();
         pf.addIncludeProperty(fe);
         Document doc = (Document)Factory.Document.fetchInstance(os, id, pf);
         User user = Factory.User.fetchInstance(os.getConnection(), doc.get_Owner(), null);
         GroupSet groups = user.get_MemberOfGroups();
         Iterator groupsIter = groups.iterator();
         while (groupsIter.hasNext())
         {
            Group group = (Group) groupsIter.next();
            if ( group.get_ShortName().equals("NOL") )
            {
               Folder folder=Factory.Folder.fetchInstance(os, "/Special Processing", null);
               // File form and save.
               DynamicReferentialContainmentRelationship drcr =
                   (DynamicReferentialContainmentRelationship)folder.file((IndependentlyPersistableObject)doc,
                  AutoUniqueName.AUTO_UNIQUE,
                  doc.getProperties().getStringValue("Name"),
                  DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE);
               drcr.save(RefreshMode.NO_REFRESH);
               break;
            }
         }
      }
      catch (Exception e)
      {
         ErrorRecord er[] = {new ErrorRecord (e)};
         throw new EngineRuntimeException(e, ExceptionCode.EVENT_HANDLER_THREW, er);
      }
   }
}
           

通过上述代码可以看出,有了event这个参数可以获取触发事件发生的类,及操作FileNeT相关API必要信息,如ObjectStore等等,从而可以完成事件处理过程。有了EventAction类的编写实例,加之上文所谈及的如何配置subscription,我们大体上对这块知识有了初步认识,下面在简单陈述下subscription所涉及的三个核心概念:event action, target object, and triggerevent。

Event action 是指一个实现了 Content Engine API's EventActionHandler 接口的 Java™ 类,即描述了当某一个 trigger event 触发 target object 定义的 subscription 时,Content Engine 需要执行的操作。

Event action 有着广泛的用途,如:

  • 通知 / 通讯:你可以实现一个 event action 用来自动根据特定的事件和源对象给合适的人发送相关的 email 等信息。
  • 记录日志 / 计数:通过跟踪 CE 中各种不同对象和事件的使用频率来自动生成关于事件的详细记录,或者自动增加相关计数器,并将这些信息写入数据库或者文件中。
  • 过滤:对于像文档生命周期(document life cycle)或者工作流流程(workflow process)等复杂的流程,您可能需要一个高级的过滤器用来在系统接收某个 document 之前对于这个 document 的内容或者 document 本身进行过滤。您也可以编写一个 event handler 来拒绝某些特定的 document 的进入并且中止或者回滚事务(transaction)。

Target object 是指被 subscription 作用的对象,它可以是以下几种类型:

  • Class definition:在这种情况下,subscription 可以影响到它的所有 instance 。
  • Single instance:在这种情况下,subscription 只会影响到该对象的某一个 version 。
  • Version series:在这种情况下,subscription 可以影响到一个 versionable object 的所有 version,而每个 version 都是一个独立的 instance 。

《ventAction和subscription的配置过程》的例子就属于 Class definition 的情况。

虽然您可以将 subscription 指派给独立的 instance,但是如果将 subscription 指派给 class 会让它变得更加有效,因为将 subscription 指派给 class 会保证它的对象会得到一致的管理。而且,在 class 上建立 subscription 会减少同时运行的 subscription 的总量,从而提升系统性能。

Trigger event 是指希望被用来触发某个 subscription 的事件,而 target object 的类型决定了哪些 trigger event 类型对于其上的 subscription 是可用的。

本文讲述了EventAction的自定义开发方式和配置subscription的相关步骤,也简要说明了下subscription在FileNet中的作用,在今后的业务其必将发挥巨大作用。