EASCloud后台事务二开最佳实践一、业务场景很多客户有定时执行任务,或者异步执行一些耗时久的业务逻辑的需求,需要使用后台事务;但目前后台事务有很多功能介绍、操作说明,却没有一个整体流程的二开事件方案。还有一些客户,想基于后台事务平台,不想依托于已有的操作,想在自己的业务场景通过代码实现后台事务的创建与发布,也没有详细的接口文档说明及二开案例。二、实践思路1.元数据二开开发功能Facade或业务功能Function,然后客户端【后台事务定义】界面,新建后台事务定义,选择已开发的Facade或Function,设置调度计划,配置参数,测试发布;2.代码二发调用后台事务提供的接口,直接代码创建发布后台事务,指定执行的业务方法、执行时间来触发执行一次;或指定指定的Function,设置调度计划来定时执行;三、详细设计BOS开发1、新建一个功能Facade或一个业务功能Function1.BOS工具切换至设计开发工具2.新建功能Facade1.新建功能Facade2.增加方法3.发布功能Facade4.在发布生成的代码中实现业务逻辑FacadeControllerBean重写刚才新增的方法例如:我创建的Facade是TestJobFacade,增加的方法是test1,那就在TestJobFacadeControllerBean重写_test1方法;3.新建业务功能Function1.新增业务功能Function2.新增操作定义Function和Facade不同,不是在代码中重写方法实现业务逻辑,而是需要引用实体的事件方法,最后实现的业务逻辑也是实体事件引用的方法;例如:引用的实体事件testEvent引用了上面新增的facade方法test1,所以最后实际执行的还是TestJobFacadeControllerBean的_test1方法;3.发布业务功能Function2、本地开发环境更新子系统树1.BOS工具切换至业务建模工具2.选择刚才新建的Facade或Function的上级目录,从包更新子系统树3、部署环境更新子系统树1.将二开包部署至服务器后,管理控制台重新产生子系统树,重启服务4、客户端创建后台事务定义1.新增后台事务定义2.选择任务选择上面步骤二开的Facade或Function方法3.配置调度计划可以设置每天、每周、每月、一次性;如果需要复杂的调度计划,可以使用自定义,填写Cron表达式,Cron表达式可以参考https://www.pppet.net/4.配置任务方法的参数5.保存6.测试事务执行一次在【后台事务监控】界面可以查询到测试的事务执行情况双击打开,可以查询详情7.发布后台事务发布后台事务,后台事务就会按照配置的调度计划定时执行业务方法DEP开发1、新建一个功能Facade或业务功能Function1.新建一个动态扩展方案2.新建业务单元3.新建Facade选择包路径,填写名称新建方法通过脚本实现业务逻辑保存4.新建Function选择包路径,填写名称新建操作信息,和BOS二开一样,Function是需要引用实体的事件方法保存5.启用方案2、客户端创建事务定义DEP创建的Facade或Function不需要更新子系统树,客户端创建后台事务定义,操作步骤和BOS开发一致,选择任务就可以选到DEP新建的Facade和Function了四、代码样例1、通过配置信息创建事务,触发一次/***@paramtitle事务定义名称*@paramhandler方法包装器*@paramscheduledTime任务计划执行时间*@paramisPersistent是否持久化(任务记录是否存数据库,是否在后台事务监控可查询到,建议持久化)*/com.kingdee.bos.service.job.JobServiceFactory.getLocalInstance(ctx).createJobInstance(Stringtitle,IJobHandlerhandler,TimestampscheduledTime,booleanisPersistent)范例:Classcls=TestJobFacade.class;//业务类StringmethodName="test";//业务方法名123456789101112Object[]params=newObject[]{};//参数MethodWrappermethodWrapper=newMethodWrapper(cls,methodName,params);//方法包装器Stringtitle="测试事务标题";booleanisPersistent=true;//是否持久化(任务记录是否存数据库,是否在后台事务监控可查询到,建议持久化)Timestamptimestamp=newTimestamp(System.currentTimeMillis()+10000);//任务计划执行时间,传null默认延迟10秒com.kingdee.bos.service.job.JobServiceFactory.getLocalInstance(ctx).createJobInstance(title,methodWrapper,timestamp,isPersistent);13141516171819202、通过事务定义创建事务,触发一次/***@paramjobDefId事务定义id*@paramparam参数*@paramscheduledTime任务计划执行时间*/com.kingdee.bos.service.job.JobServiceFactory.getLocalInstance(ctx).createJobDef(StringjobDefId,Objectparam,TimestampscheduledTime)范例:Classcls=TestJobFacade.class;//业务类StringmethodName="test";//业务方法名Object[]params=newObject[]{};//参数MethodWrappermethodWrapper=newMethodWrapper(cls,methodName,params);//方法包装器Stringtitle="测试事务标题";Stringdescrption="测试事务描述";booleanisPersistent=true;//是否持久化(任务记录是否存数据库,是否在后台事务监控可查询到,建议持久化)JobDefjobDef=newJobDef(ctx,null,title,descrption,null,null,isPersistent,methodWrapper);//事务定义StringdefId=jobDef.getDefId();//获取事务定义id,可自行记录,便于下次触发使用Timestamptimestamp=newTimestamp(System.currentTimeMillis()+10000);//任务计划执行时间,传null默认延迟10秒com.kingdee.bos.service.job.JobServiceFactory.getLocalInstance(ctx).createJobInstance(jobDef.getDefId(),params,timestamp);12345678910111213141516171819202122233、流程定义创建事务/***@paramname事务定义名称*@paramfunc功能对象*@paramoperation功能的操作*@paramjobContext参数上下文*@paramscheduale调度计划*@paramlocale语言环境*/com.kingdee.bos.workflow.service.ormrpc.EnactmentServiceFactory.createEnactService(Context).createJobProcessDef(Stringname,FunctionObjectInfofunc,OperationInfooperation,MapjobContext,Stringscheduale,Localelocale)范例:Localelocale=ctx.getLocale();Stringname="测试事务标题";Stringscheduale="000/1**?";//调度计划:Cron表达式,000/1**?是每小时执行一次MapjobContext=newHashMap();//参数上下文FunctionObjectInfofunc=com.kingdee.bos.metadata.MetaDataLoaderFactory.getLocalMetaDataLoader(ctx).getFunction(newcom.kingdee.bos.metadata.MetaDataPK("com.kingdee.eas.custom.testjob.TestJobFunction"));//通过元数据PK获取FunctionOperationInfooperation=func.getOperation().get(0);//获取Function的第一个操作com.kingdee.bos.workflow.service.ormrpc.EnactmentServiceFactory.createEnactService(ctx).createJobProcessDef(name,func,operation,jobContext,scheduale,locale);1234567891011121314151617181920212223五、注意事项无六、补丁影响无