EAS-BOS编程模型(6)

2019-06-11 00:14

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 26 页 共 31 页

3.8.2. 定义业务功能

业务功能与界面元素关联,并且被指定到工作流的某个节点上。消息中心处理消息时,将读取当前节点关联的业务功能,从而找到相应的界面,将其展现出来。例如ActionSubmit功能,当流转到该指定了该功能的节点时,SampleBillEditUI将被调出。

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 27 页 共 31 页

3.8.3. 定义流程

在这个流程中我们定义了两个普通的人工节点和一个审批节点: 节点名称 提交 删除 审批

变量名称 billID billNumber maResult

任务 ActionSubmit ActionRemove <无须设置> 类型 内码 字符串 枚举 出口参数 单据ID ==> billID 单据编号 ==> billNumber 审批结果 ==> maResult 描述 单据ID 单据编号 多级审批的结果 在定义消息或者编写脚本时,可以引用流程变量: 注:为了测试方便,我们将参与人全部设置成流程发起人。

3.8.4. 发布流程

为了使用公共的工作流批量处理功能,我们还需要稍微修改一下SampleBill.entity的扩展属性:

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 28 页 共 31 页

定义好流程后,右键选择发布,流程就即时生效了。现在提交一张单据,切换到消息中心看看有没有新的消息。双击未处理消息就可以调出相应的功能界面了。

4. 编程注意事项

以下是一些编程的注意事项,提醒开发人员注意。

4.1. 协议类

协议类包括数据封装类和接口等。

4.1.1. 不要在协议类中引用客户端或服务端特有的类

在部署EAS时,客户端和服务端特定的类是分离的,只有协议类在两端都部署。因此若协议类中引用了服务端特有的类,则在客户端使用协议类时就会出现类找不到的错误;反之亦然。 4.1.2. 尽量使用Selector来限制查询数据量

ORMapping引擎将根据Selector指定的属性列表,从数据库中查询数据并封装到协议类中。Selector信息将直接影响到查询的数据量,所以应该尽量只检索必需的属性。一般的原则是只将程序中引用到的属性加入Selector。

4.1.3. 所有的金额、数量属性统一用BigDecimal类型

ERP系统对金额、数量的精度要求很高, 而float、double这些类型能够处理的精度有限,只有BigDecimal才能够支持无限精度的数字。程序在执行数学运算时也应该始终使用BigDecimal。 4.1.4. 正确地构造BigDecimal

BigDecimal有多个重载的构造函数,这些函数表面差异不大,对程序运行却有着至关重要的影响。若是用BigDecimal(double)构造一个数字,则在传入JDBC存储到数据库时将可能出现OutOfArrayIndexError异常。

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 29 页 共 31 页

4.2. 服务端

EAS的服务端代码主要包括EJB组件类。

4.2.1. 不要用对象级的变量存储信息

前面提到过,EAS的服务端组件采用的是无状态SessionBean,在两次调用方法期间,可能是不同的EJB对象在响应请求,因此如果在对象变量中存储信息,可能会导致这些信息的紊乱。若遇到必须在多个方法间共享信息的情况,请考虑一下是否可以用参数传递的方式解决。 4.2.2. 在EJB组件中不要启动多线程

EJB组件在当前线程上下文中存储了事务相关的信息,如果在组件中又启动了线程,则会出现事务的紊乱。与这条原则相关的一个比较隐蔽的场景出现在服务端调用Query查询中,Query查询时启动了一个新的线程获取记录ID,然后当前线程等待前者返回结果。所以绝对不要在服务端调用Query执行查询操作。

4.2.3. 获取当前登录信息

服务端的Context中存储了当前登录信息,可以通过工具类ContextUtil来获取当前组织、当前用户等信息。要对何时使用这些信息有个正确的认识,例如对单据的合法性进行校验时应该使用单据所属公司而不是登录信息中的当前公司。 4.2.4. 数据库资源的正确释放

数据库资源是非常有限的资源,若在使用完毕后长时间不释放,则可能导致资源耗尽,系统无法继续运行。这些资源包括结果集、语句、连接等,为了保证可以正常释放它们,一般要将释放代码放在一个finally子句中,如下:

Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { } finally { }

DBUtils.cleanup(rs, ps, conn); conn = getConnection(ctx); ps = conn.prepareStatement(sql); rs = ps.executeQuery();

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 30 页 共 31 页 要保证有一个变量引用这些资源,以便在finally中释放它们。绝不允许下列代码出现: ps = getConnection(ctx).prepareStatement(sql);

这样,其它地方无法引用连接对象,也就无法释放它了。

4.2.5. 尽量使用参数化的SQL

一般数据库都会缓存执行过的SQL,若之后的查询SQL语句完全相同只是参数值不同,则可以直接执行,不需要再次翻译语句,可以大大提高执行效率。参数化的SQL还自动处理一些特殊字符如单引号等,避免了恶意攻击的发生。 4.2.6. 避免写只适用于特定数据库的SQL

尽管我们有了KSQL翻译引擎,可以写出标准的KSQL让引擎针对不同的目标数据库执行必要的翻译。但这仅仅是语法层次的翻译,有些语句从语法上看完全符合KSQL标准,引擎也可以正确翻译,但是可能带来意想不到的问题。例如Update T1 Select From T2这种语法只有SQL Server直接支持,若目标数据库是Oracle、DB2等,KSQL引擎翻译后的语句将是一个极其低效的查询。当遇到这种情况时应该考虑是否可能用循环更新来代替,以便程序具有更好的跨数据库能力。

4.3. 客户端

4.3.1. 获取当前登录信息

与服务端相对应,客户端也有一个对应的类存储当前登录信息:SysContext,其中存储 当前公司、当前用户等信息。 4.3.2. 获取组件的远程接口

组件的远程接口一般通过调用XXXFactory.getRemoteInstance()得到,这是一个比较耗时的过程,所以想到了将它缓存到界面上。但是绝对不要这么做,EAS现在提供了一个网络续连的功能,当出现网络问题时,自动弹出一个窗口,让用户选择“退出”还是“连接”,若选择“连接”,则再次获取远程接口进行调用。若缓存了该接口,则这个界面始终只能使用这个损坏的连接,无法支持网络续连。 4.3.3. 侦听器的挂接和卸载

Swing的事件模式采用了大量的Listener,这些Listener负责监视相关事件的发生,在必要时调用事件响应代码。当应用框架装载业务数据时(loadFields),数据被填充到相关控件中,这可能引起大量事件的触发。为了避免这个情况,一般在loadFields中采用以下逻辑: detachListeners; load data to controls; attachListeners;

KINGDEE DOC ID:KDSP_EAS_T_V3.0.0 软件构架设计文档 第 31 页 共 31 页 在装载数据前首先去掉所有的监听器,数据装载完毕后再次安装,从而避免了大量无效的事件响应。

4.3.4. 菜单、工具栏、快捷键的禁用与启用

EAS用一个Action将菜单、工具栏、快捷键联系起来,并且在Action上提供了Enable和Visible属性。只要直接设置Action的这些属性就可以控制三者的状态,不应该逐个去控制。 4.3.5. 后台线程更新UI

界面编程有时必须采用多线程,例如进度条的显示,此时UI线程显示一个进度窗口,后台工作线程则将实时进度反映到进度条中。由于Swing控件不直接支持多线程,后台线程应该调用SwingUtilities.invokeLater或invokeAndWait执行界面更新操作。

5. 总结

该文档以一个单据业务例子描述了EAS真个实现的过程和编程模型。 通过学习这个文档并结合样板工程的操作指导和范例代码,新开发人员应该能够比较快速地编写出高质量的代码。


EAS-BOS编程模型(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:贵阳专版2019届中考道德与法治总复习九年级下册第十七讲走向未来

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: