后台事务开发文档汇总.docx
- 文档编号:814640
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:32
- 大小:782.56KB
后台事务开发文档汇总.docx
《后台事务开发文档汇总.docx》由会员分享,可在线阅读,更多相关《后台事务开发文档汇总.docx(32页珍藏版)》请在冰豆网上搜索。
后台事务开发文档汇总
后台事务开发文档
目录
1.简单后台事务示例3
2.后台事务执行过程及原理13
2.1.后台事务定义13
2.2.后台事务发布14
2.3.后台事务执行15
3.代码实现后台事务定义22
3.1.非持久化后台事务22
3.2.错过策略25
3.3.人工干预(撤销,挂起,唤醒)28
3.4.调度计划时间33
1.
简单后台事务示例
在进行后台事务示例测试之前,我们需要做一些准备工作,首先,我们要在BOSStudio的BIM视图下新建几个元数据,如图1所示:
如上图所示,新建了四个元数据(其中T_BO_BandOffice.table是根据实体右键导出表直接导出得到的),其实这四个元数据很简单,FileLogFacade.facade只有一个方法logWriter(Stringstr);该方法实现了向服务器上的C:
/file.log输入日志。
BandOffice.entity上新建了一个方法,该方法和FileLogFacade.facade的方法logWriter(Stringstr)作用一样,名字为testLog(Stringstr),只是为了示范两个不同的调用。
实体BandOffice.entity还新建了一个TestLogEvent的事件,该事件可以引用实体本身的方法logWriter,也可以引用功能FileLogFacade的testLog方法。
再定义了一个业务功能FileLogFunction,在这个业务功能中定义了一个操作fileLog;通过应用,与实体上的事件关联起来。
在定义好这些元数据后,我们需要把这些元数据进行发布,使服务器端在运行时能够加载这些元数据。
上面是我们对解决方案的发布方案设置,如红框标识的,我把元数据发布后生成的代码放在W:
\workspace\bs_job\dev\test目录中,如下图所示,元数据发布后在这个目录下生成的代码,这是实体和功能(facade)发布时生成的代码,其他元数据发布时不生成代码。
在FileLogFacadeControllerBean中会生成功能定义的_logWriter方法,通过在这个方法中写逻辑即可实现,而实体定义的方法会在BandOfficeControllerBean中生成_testLog方法。
元数据发布后,我们需要重新生成系统子树,这样我们在重启服务器后可以在事务任务选择树中看到我们定义的功能。
具体生成系统子树的方法,请参照《生成系统子树的两种方法.doc》。
登陆EAS后,我们选择系统平台——>后台事务定义,进入后台事务定义界面:
接着我们就按要求进行定义,下面我们定义调度计划设置:
定义好后,我们进行保存,这个时候我们可以进行发布了,如下图:
我们再进入:
系统平台——>后台事务定义表,我们可以看到我们刚才定义的那个事务了
我们设置好了调度计划,当时间到达时,触发该事务,就会执行一个事务实例,我们可以查看该事务实例,我们也可以直接点击工具栏中的启动,这样会立刻启动一个事务实例。
从上面可以看出,事务执行成功。
我们再来看看我们实现的功能,就是在服务器目录下写入一条时间信息记录:
2.
后台事务执行过程及原理
首先我们要弄清楚,在EAS系统的后台事务管理平台中定义一个后台事务的过程是怎样的,你可以通过对代码的跟踪进行了解,
2.1.后台事务定义
首先我们在后台事务定义界面上新建一个后台事务(如下图所示),这些后台事务定义信息会被保存在T_WFD_PROCESSDEF中,可以在这个界面对已经定义好的后台事务定义进行修改和删除,当我们选择左边系统子树的某个后台事务定义节点,它对应的信息就会从该表中获得并显示在右边的界面上。
现在我想描述一下右边这颗系统子树的生成过程。
这可系统子树是在该界面的构造函数的initializeUI()方法中进行初始化的
finalBusinessTreeUtiltempPTU=newBusinessTreeUtil(
BusinessTreeUtil.PROCESS);
((KingdeeTreeModel)this.packagekDTree.getModel()).setRoot(null);
JobUtils.resetStartTimeMillis();
tempPTU.initialBusinessTreeView(this.packagekDTree,true);
JobUtils.printTimeMillis("initialBusinessTreeView");
this.packagekDTree.addTreeSelectionListener(new
InnerTreeSelectionListener());
BusinessTreeUtil中有三个静态变量,分别为PROCESS,FUNCTION,ENTITY,分别用来生成不同的系统子树,在对系统子树进行初始化调用了两个方法,第一个是initialPackageTree(tree,flag);这个方法是获得标准包结构的树,第二个是initalFunctionOrJobProcessTree(tree,flag);这个是获得客户化的树形结构,通过该方法可以在标准化得包结构下添加功能节点或后台事务定义节点。
如果是生成功能(function)子树或实体(entity)子树,这就得获取这些元数据的集合,而它们对应的集合类:
FunctionObjectCollection和EntityObjectCollection,获取这些集合的方法为:
IMetaDataLoaderloader=MetaDataLoaderFactory.
getRemoteMetaDataLoader()
FunctionObjectCollectionfuncol=loader.getFunctions()
EntityObjectCollectionentcol=loader.getEntityCollection();
2.2.后台事务发布
后台事务定义完成以后,通过发布,我们就可以在后台事务定义报表看到我们定义的后台事务了,已发布的后台事务不允许进行删除。
publicvoidrelease(ProcessDefprocess)throwsBOSException{
JobDefdef=JobServiceUtil.toJobDef(ctx,process);
Triggertrigger=JobServiceUtil.toTrigger(def,process);
IJobServicesvc=JobServiceFactory.getLocalInstance(ctx);
svc.createJobDef(def,trigger,true);
}
后台事务定义被发布以后,产生了一个新的对象JobDef,对用在数据库中的表是T_JOB_DEF。
后台事务实例(Job)就是根据这个定义来产生的。
由上面的代码可知,后台事务定义(JobDef)和触发器(Trigger)是由流程定义(ProcessDef)转换过来的,这是因为在以前的后台事务是按照工作流的方式进行处理的,每一个后台事务定义都会生成一个流程定义保存在数据库表(T_WFD_PROCESSDEF)的一个字段中,我们用代码实现后台事务定义就不必通过这样获取流程定义(JobDef)。
有上面代码可知,通过调用JobService的createJobDef(JobDefdef,Triggertrigger,booleanenable);方法创建后台事务定义(实际上是通过反射调用了JobManager的createJobDef(JobDefdef,Triggertrigger,booleanenable)方法),通过该方法将JobDef,Trigger对象保存到数据库中的T_JOB_DEF和T_TRIGGER表中。
从而完成了后台事务定义的发布功能。
2.3.后台事务执行
后台事务每执行一次就会产出一个后台事务实例(Job),持久化后台事务会将后台事务实例信息保存在T_JOB_INST表中。
我们可以通过两种方式来触发后台事务执行,第一种是通过后台事务界面上的“启动”按钮直接触发产生一个后台事务实例,第二种是通过定义一个触发器(Trigger)来与该后台事务定义关联起来,用触发器来触发产生一个后台事务实例。
下面我们分别来讨论通过这两种方法是怎样触发产生后台事务实例的。
“启动”按钮触发后台事务。
当我们点击“启动”按钮会触发该按钮的事件,会调用到该界面JobProcessDefineListUI的actionStart_actionPerformed方法,通过方法调用,我们可以知道它调用了JobServiceUIFacade的createJobInstance(jobDefId,null,null),在这个类中,通过获取到了IjobService接口,调用了jobservice的createJobInstance方法;
publicStringcreateJobInstance(StringjobDefId,
Objectparam,TimestampscheduledTime)throwsBOSException{
JobDefdef=JobDefCache.getJobDef(ctx.getAIS(),jobDefId);
if(def==null)thrownewBOSException("jobdefdoesn'texist,itsid
is{"+jobDefId+"},datacenter:
"+ctx.getAIS());
if(scheduledTime==null)
scheduledTime=newTimestamp(System.currentTimeMillis()+1000);
Jobjob=def.newInstance(ctx,param,scheduledTime);
manager.add(job);
returnjob.getTitle();
}
从上面这个方法可以看出,首先由jobDefId获取到JobDef对象def,在设置这个产生的任务实例的计划执行时间为当前时间的下一秒。
然后由后台事务定义对象def的newInstance(ctx,param,scheduledTime)产生一个后台事务实例对象job,再由后台事务管理器JobManager(单子模式)调用add(job)方法把这个任务实例加载到等待队列或者就需队列中去;
触发器触发后台事务。
如果我们在后台事务定义的时候对其关联了相应的触发器,则当下一次触发时间到达时,触发器就会触发与之关联的后台事务定义(JobDef)产生一个后台事务实例(Job)。
触发器触发后台事务的过程是怎样的呢?
首先:
服务器启动时会初始化触发器加载类(TriggerLoader),该类实现了IJobHandler,IcoreJobHandler两个接口,本身就是一个任务处理器,这个类的作用是:
触发器加载者,定期从数据库加载新增的触发器。
其load()方法会定期被调用执行
/**加载触发器*/
privateintload()throwsException{
StringBuffersql=newStringBuffer();
sql.append("select*fromT_JOB_TRIGGERwherefisvalid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 后台 事务 开发 文档 汇总