ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:782.50KB ,
资源ID:9017878      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9017878.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(后台事务开发文档模板.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

后台事务开发文档模板.docx

1、后台事务开发文档模板后台事务开发文档目 录1. 简单后台事务示例 32. 后台事务执行过程及原理 132.1. 后台事务定义 132.2. 后台事务发布 142.3. 后台事务执行 153. 代码实现后台事务定义 223.1. 非持久化后台事务 223.2. 错过策略 253.3. 人工干预(撤销,挂起,唤醒) 283.4. 调度计划时间 331. 简单后台事务示例在进行后台事务示例测试之前,我们需要做一些准备工作,首先,我们要在BOS Studio的BIM视图下新建几个元数据,如图1所示:如上图所示,新建了四个元数据(其中T_BO_BandOffice.table是根据实体右键导出表直接导出

2、得到的),其实这四个元数据很简单,FileLogFacade.facade只有一个方法logWriter(String str);该方法实现了向服务器上的C:/file.log输入日志。BandOffice.entity上新建了一个方法,该方法和FileLogFacade.facade的方法logWriter(String str)作用一样,名字为testLog(String str),只是为了示范两个不同的调用。实体BandOffice.entity还新建了一个TestLogEvent的事件,该事件可以引用实体本身的方法logWriter,也可以引用功能FileLogFacade的testL

3、og方法。再定义了一个业务功能FileLogFunction,在这个业务功能中定义了一个操作fileLog;通过应用,与实体上的事件关联起来。在定义好这些元数据后,我们需要把这些元数据进行发布,使服务器端在运行时能够加载这些元数据。上面是我们对解决方案的发布方案设置,如红框标识的,我把元数据发布后生成的代码放在W:workspacebs_jobdevtest目录中,如下图所示,元数据发布后在这个目录下生成的代码,这是实体和功能(facade)发布时生成的代码,其他元数据发布时不生成代码。在FileLogFacadeControllerBean中会生成功能定义的_logWriter方法,通过在这

4、个方法中写逻辑即可实现,而实体定义的方法会在BandOfficeControllerBean中生成_testLog方法。元数据发布后,我们需要重新生成系统子树,这样我们在重启服务器后可以在事务任务选择树中看到我们定义的功能。具体生成系统子树的方法,请参照生成系统子树的两种方法.doc。登陆EAS后,我们选择系统平台后台事务定义,进入后台事务定义界面:接着我们就按要求进行定义,下面我们定义调度计划设置:定义好后,我们进行保存,这个时候我们可以进行发布了,如下图:我们再进入:系统平台后台事务定义表,我们可以看到我们刚才定义的那个事务了我们设置好了调度计划,当时间到达时,触发该事务,就会执行一个事务

5、实例,我们可以查看该事务实例,我们也可以直接点击工具栏中的启动,这样会立刻启动一个事务实例。从上面可以看出,事务执行成功。我们再来看看我们实现的功能,就是在服务器目录下写入一条时间信息记录:2. 后台事务执行过程及原理首先我们要弄清楚,在EAS系统的后台事务管理平台中定义一个后台事务的过程是怎样的,你可以通过对代码的跟踪进行了解,2.1. 后台事务定义首先我们在后台事务定义界面上新建一个后台事务(如下图所示),这些后台事务定义信息会被保存在T_WFD_PROCESSDEF中,可以在这个界面对已经定义好的后台事务定义进行修改和删除,当我们选择左边系统子树的某个后台事务定义节点,它对应的信息就会从

6、该表中获得并显示在右边的界面上。现在我想描述一下右边这颗系统子树的生成过程。这可系统子树是在该界面的构造函数的initializeUI()方法中进行初始化的final BusinessTreeUtil tempPTU = new BusinessTreeUtil(BusinessTreeUtil.PROCESS);(KingdeeTreeModel) this.packagekDTree.getModel().setRoot(null);JobUtils.resetStartTimeMillis();tempPTU.initialBusinessTreeView(this.packagekDT

7、ree,true);JobUtils.printTimeMillis(initialBusinessTreeView);this.packagekDTree.addTreeSelectionListener(new InnerTreeSelectionListener();BusinessTreeUtil中有三个静态变量,分别为PROCESS,FUNCTION,ENTITY,分别用来生成不同的系统子树,在对系统子树进行初始化调用了两个方法,第一个是initialPackageTree(tree ,flag);这个方法是获得标准包结构的树,第二个是initalFunctionOrJobProce

8、ssTree(tree,flag);这个是获得客户化的树形结构,通过该方法可以在标准化得包结构下添加功能节点或后台事务定义节点。如果是生成功能(function)子树或实体(entity)子树,这就得获取这些元数据的集合,而它们对应的集合类:FunctionObjectCollection和EntityObjectCollection,获取这些集合的方法为:IMetaDataLoader loader = MetaDataLoaderFactory. getRemoteMetaDataLoader()FunctionObjectCollection funcol = loader.getFun

9、ctions()EntityObjectCollection entcol = loader.getEntityCollection();2.2. 后台事务发布后台事务定义完成以后,通过发布,我们就可以在后台事务定义报表看到我们定义的后台事务了,已发布的后台事务不允许进行删除。 public void release(ProcessDef process) throws BOSException JobDef def=JobServiceUtil.toJobDef(ctx, process); Trigger trigger=JobServiceUtil.toTrigger(def, proc

10、ess); IJobService svc=JobServiceFactory.getLocalInstance(ctx); svc.createJobDef(def, trigger, true); 后台事务定义被发布以后,产生了一个新的对象JobDef,对用在数据库中的表是T_JOB_DEF。后台事务实例(Job)就是根据这个定义来产生的。由上面的代码可知,后台事务定义(JobDef)和触发器(Trigger)是由流程定义(ProcessDef)转换过来的,这是因为在以前的后台事务是按照工作流的方式进行处理的,每一个后台事务定义都会生成一个流程定义保存在数据库表(T_WFD_PROCESS

11、DEF)的一个字段中,我们用代码实现后台事务定义就不必通过这样获取流程定义(JobDef)。有上面代码可知,通过调用JobService的createJobDef(JobDef def, Trigger trigger, boolean enable);方法创建后台事务定义(实际上是通过反射调用了JobManager的createJobDef(JobDef def, Trigger trigger, boolean enable)方法),通过该方法将JobDef,Trigger对象保存到数据库中的T_JOB_DEF和T_TRIGGER表中。从而完成了后台事务定义的发布功能。2.3. 后台事务执

12、行后台事务每执行一次就会产出一个后台事务实例(Job),持久化后台事务会将后台事务实例信息保存在T_JOB_INST表中。 我们可以通过两种方式来触发后台事务执行,第一种是通过后台事务界面上的“启动”按钮直接触发产生一个后台事务实例,第二种是通过定义一个触发器(Trigger)来与该后台事务定义关联起来,用触发器来触发产生一个后台事务实例。下面我们分别来讨论通过这两种方法是怎样触发产生后台事务实例的。“启动”按钮触发后台事务。当我们点击“启动”按钮会触发该按钮的事件,会调用到该界面JobProcessDefineListUI的actionStart_actionPerformed方法,通过方法

13、调用,我们可以知道它调用了JobServiceUIFacade的createJobInstance(jobDefId, null, null),在这个类中,通过获取到了IjobService接口,调用了jobservice的createJobInstance方法;public String createJobInstance(String jobDefId, Object param, Timestamp scheduledTime) throws BOSException JobDef def=JobDefCache.getJobDef(ctx.getAIS(), jobDefId); if

14、(def=null)throw new BOSException(job def doesnt exist, its id is +jobDefId+, datacenter: +ctx.getAIS();if(scheduledTime=null)scheduledTime=new Timestamp(System.currentTimeMillis()+1000); Job job=def.newInstance(ctx, param, scheduledTime); manager.add(job); return job.getTitle(); 从上面这个方法可以看出,首先由jobDe

15、fId获取到JobDef对象def,在设置这个产生的任务实例的计划执行时间为当前时间的下一秒。然后由后台事务定义对象def的newInstance(ctx, param, scheduledTime)产生一个后台事务实例对象job,再由后台事务管理器JobManager(单子模式)调用add(job)方法把这个任务实例加载到等待队列或者就需队列中去;触发器触发后台事务。如果我们在后台事务定义的时候对其关联了相应的触发器,则当下一次触发时间到达时,触发器就会触发与之关联的后台事务定义(JobDef)产生一个后台事务实例(Job)。触发器触发后台事务的过程是怎样的呢?首先:服务器启动时会初始化触发

16、器加载类(TriggerLoader),该类实现了IJobHandler, IcoreJobHandler两个接口,本身就是一个任务处理器,这个类的作用是:触发器加载者,定期从数据库加载新增的触发器。其load()方法会定期被调用执行/*加载触发器*/ private int load()throws Exception StringBuffer sql=new StringBuffer(); sql.append(select * from T_JOB_TRIGGER where fisvalid=Y AND fisAutoLoad=Y AND ); sql.append().append(

17、TriggerIsolationLevel.sqlWhere(dc) .append();/符合隔离边界 sql.append( and fholderid is null);/无持有者 /只加载已生效的触发器 sql.append( and fvalidateTime=?); int types=new intTypes.TIMESTAMP; Timestamp now=new Timestamp(System.currentTimeMillis(); Object values=new Objectnow; ArrayList items=SQL.executeQuery(dc, sql.toString(), types, values); Trigger tr; for(int i=0; ie.getTime() job.setState(JobState.Missed); continue; /执行 executed=execute(job); catch(Throwable t) log.error(execute job +job+ failed!,t); finally /释放任务 RunningJobs.dispose(job); if(executed)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1