简介:这份Maximo入门培训资料面向刚接触企业资产管理系统的开发者与实施人员,帮助其从技术架构到代码开发建立完整认知。内容围绕J2EE体系展开,涵盖RMI业务对象交互、程序结构与模块组成、页面开发中的JSP与常用控件、基于WebSphere Process Server的工作流模型与组件标记、后台计划任务的界面配置与代码实现,以及Oracle、DB2等数据库连接与更新配置,并附有MboSet、Mbo、FldXX等代码示例和常用类说明。资源包共1个docx文档,约436KB,以目录清晰的培训讲义形式组织,便于按章节顺序阅读或针对性查阅。已有360人学习,适合作为入门阶段梳理知识框架、理解Maximo开发流程的参考材料。
1. 从 J2EE 到 MBO:一张 Maximo 入门培训的知识地图
很多人第一次接触 Maximo 入门培训,会以为这是一门“点点鼠标配页面”的配置课,真正翻完目录才发现,它其实是一条从底层架构一路铺到业务对象的完整链路:J2EE 与 RMI 撑起分布式调用,XML 与 Servlet 撑起表现层,Mbo/MboSet 撑起持久层,工作流、后台任务、数据库配置再把这些能力落到具体业务场景里。换句话说,这份培训不是零散功能点的拼盘,而是一张有层次的地图——上层是页面与工作流,中层是程序结构与 Servlet 调度,底层是 MBO 与 OR 映射。它适合已经会写 Java、想系统进入企业资产管理开发的人,也适合正在复习、需要把零散知识串成体系的人。先把这张地图记住,后面每一章都是在给地图上的某个区域填细节。
2. 技术底座与程序结构:J2EE 架构下的分层复习重点
2.1 六项核心技术,决定了后面所有模块的写法
Maximo 的技术介绍部分看起来像一段名词罗列,但梳理下来会发现,这六项技术恰好对应了后面每一章的“为什么这么写”。把它们当成一条因果链来记,比死背名词有效得多。
| 技术 | 在 Maximo 中的角色 | 对应到哪一章 |
|---|---|---|
| RMI | 业务对象跨 JVM 调用的机制,分布式设计的基础 | 程序结构、MBO 远程接口 |
| Ajax | 页面逻辑表现与用户交互,保证操作流畅 | 页面开发 |
| 半自动对象/关系映射 | 提高开发效率、方便维护 | 数据库配置、MBO |
| XML | 应用页面与信息交互的载体 | 页面开发、表现层 |
| 事务处理 | 框架自动处理,长事务需纳入事务队列 | 代码开发、MboSet |
| OR 持久化 | 系统级映射,持久层只需继承基类 | Mbo/MboSet |
| 缓存机制 | 系统级缓存,数据变化时自动重载 | 后台任务、性能相关 |
| 日志与异常 | 扩充 Log4j,异常做了包装 | 全流程排错 |
这张表最值得反复看的是最后两行。缓存和日志异常在入门阶段最容易被当成“框架自动搞定”而跳过,但它们恰恰是后面调试工作流、后台任务时最先要用到的东西。事务处理那一行也要留意:框架给的是自动事务,但长事务必须显式纳入事务队列,这一点在写 MboSet 的 save/commit 时是血泪经验高发区。
2.2 程序结构:从 jar 包到三层架构
程序结构这一块,复习时建议按“包 → 层 → 入口”三层来记,而不是按目录顺序背。
先看包。businessobjects.jar 承载业务相关类,mboejb.jar 与 meajmsejb.jar 负责集成,mbojava.jar 是自测试包,properties.jar 放配置,resources 放资源,maximouiweb.war 是前台应用,mboweb.war 是启动加载的 web 应用,meaweb.war 是集成相关的 web 应用,META-INF 放描述文件。记不住全部没关系,抓住一条主线:启动靠 mboweb,前台靠 maximouiweb,业务靠 businessobjects。
再看分层。表现层的页面除登录验证外,内容全部由 XML 提供,这些 XML 存在 MAXPRESENTATION 表里,由 JSP 控制标签组件组成,components 组件配合 JavaScript 脚本生成最终页面,CSS 文件夹定义通用样式。控制层的核心是 mboweb 部署描述符里的 MAXIMOStartupServlet,它读取 maximo.properties,以 Properties 对象传给 MXServer.start,从而建立 MXServer 实例并初始化相关信息。业务层与持久层则在 businessobjects 里按包划分:psdi.app.* 定义业务对象 Mbo 与 MboSet,psdi.server.* 管数据库连接、session、线程与数据字典加载,psdi.util.* 放克隆、删除、加密解密等工具类,psdi.workflow.* 放工作流逻辑,psdi.mbo.* 是核心持久层与 OR 映射。
这里有个容易被忽略的细节:MXServer 同时承担系统服务和应用服务。系统服务包括连接池建立与管理、缓存实现、调用 MaximoDD 从数据库读取并加载全部数据字典、实例化系统与应用服务对象、远程服务定位、注册 RMI、MaxSession 线程管理;应用服务则是与业务相关的 MBO。复习时把这两类服务分开记,后面理解“为什么改一个数据字典要重启”就顺了。
2.3 控制层入口:两个 Servlet 的分工
控制层有两个 Servlet 必须分清,考试和实际排错都爱考。
<!-- mboweb 部署描述符:启动入口 --> <servlet> <servlet-name>MAXIMOStartupServlet</servlet-name> <servlet-class>psdi.servlet.MAXIMOStartupServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <!-- maximouiweb 部署描述符:页面请求入口 --> <servlet> <servlet-name>webclient</servlet-name> <servlet-class>psdi.webclient.servlet.WebClientServlet</servlet-class> <init-param> <param-name>char_encoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>webclient</servlet-name> <url-pattern>/ui/*</url-pattern> </servlet-mapping>第一段的关键参数是load-on-startup,值为 2 表示容器启动时即加载,它负责读配置、起 MXServer。第二段的关键是url-pattern为/ui/*,所有匹配该路径的 URL 都映射到 WebClientServlet,由它定义页面内容类型并调用 WebClientSession 处理。char_encoding设为 UTF-8 是中文环境下的常见配置点,改错会出现页面乱码。理解这两个入口的分工,排错时就能快速判断问题出在“系统没起来”还是“页面请求没进对 Servlet”。
3. 页面开发与工作流:配置化开发的两条主线
3.1 页面开发:应用程序设计器能做什么、不能做什么
页面开发的核心工具是“应用程序设计器”,它的定位很明确:让技术用户和非技术用户都不写代码就能配置应用。拖放功能简化编辑过程,常见修改包括移动字段和部分、创建新字段、表和标签页;高级功能包括创建或复制应用程序、定义签名选项、编辑工具栏和“选择操作”菜单。
复习时要把“能配的”和“要写代码的”分开。能用设计器完成的是布局与结构层面的调整,比如字段位置、标签页组织、工具栏菜单;一旦涉及业务校验、跨对象联动、复杂显示逻辑,就要回到 MBO 层写代码。这个边界不清,就会出现“什么都想在设计器里配”的翻车现场。另外,页面内容本质是存在 MAXPRESENTATION 表里的 XML,所以改页面配置本质上是在改这份 XML 的定义,理解这一点,后面做迁移和环境同步时就不会把它当成纯前端文件看待。
3.2 工作流模型:先记模型要素,再记节点类型
工作流设计器用来为记录创建一系列路径,整个过程可以理解为一幅图,交互式指引记录或用户走完一系列步骤。工作流定义包含这些要素:过程模型、活动、转换、条件、相关数据、角色,以及需要激活的内部/外部程序。涉及的应用程序有一串,复习时按功能分组更好记:Actions 操作、Communication Templates 通信模板、Escalations 上报与自动触发属于“动作与触发”;Inbox/Assignments Setup 收件箱设置、People 人员、Person Groups 人员组、Roles 角色属于“人与分配”;Workflow Application、Workflow Designer、Workflow Inbox 属于“工作流自身的管理界面”。
节点类型是这一章的重点,也是最容易混的地方。用一张对比表锁住差异:
| 节点 | 核心作用 | 关键约束 |
|---|---|---|
| 开始 | 过程起点 | 任何过程只能有一个 |
| 停止 | 过程结束、记录脱离控制 | 可放置多个 |
| 任务 | 指引记录路径,需用户肯定/否定响应 | 至少一个连接引出,最多一正一反两个输出 |
| 条件 | 按记录信息自动指向 | 必须有一正一反两条连接,由 SQL 表达式解析真假 |
| 手动输入 | 用户从菜单选下一步 | 常配合交互节点使用 |
| 子过程 | 嵌入另一个完整工作流 | 除正向线外可引反向线,遇停止沿原路返回主过程 |
| 交互 | 提供既定选项引导解决路径 | 多个进入线,只能一个退出线 |
| 等待 | 对特定操作做出反应 | 过程在此暂停,直到指定事件发生 |
任务节点的参数值得单独记:标题是图标下显示的文字,描述是节点说明,应用程序是该流程应用的应用程序,时限规定任务完成时长、超时则重新分配给“升级角色”;任务分配为任务分配角色,角色下的表达式可限制只有满足条件才分配,这对控制转发很有用;接受操作有两个选项——所有人都接受才算接受,或任一人接受即算接受。这些参数在实践题里经常被拿来设陷阱。
3.3 工作流实践:改一个现成过程比新建更有效
实践部分建议直接拿 demo 库里的过程 APPWFWO 开刀:查看它、修改它、再到工单里测试。为什么改现成的比从零建更有效?因为现成过程已经带好了角色、应用程序关联和节点连接,你能直观看到“条件节点的 SQL 表达式怎么写”“任务节点的正反输出怎么接”。改的时候重点观察三处:条件节点两条连接的真假走向、任务节点的接受策略、子过程遇到停止后返回主过程的路径。这三处看懂了,工作流这一章基本就通了。
4. 后台任务与数据库配置:容易被低估的两块硬骨头
4.1 后台任务:界面配置加一段固定骨架代码
后台任务开发分界面配置和代码开发两步。界面侧新建后台任务并配置相关参数,代码侧继承 SimpleCronTask,骨架非常固定:
public class CrontaskTest extends SimpleCronTask { public void init() throws MXException { super.init(); // 参数初始化:读取界面配置传入的参数 } public void cronAction() { // 执行相应逻辑:定时触发的实际业务处理 } }这段代码短,但两个方法的职责必须分清。init()负责参数初始化,界面配置的参数在这里读进来,漏了这一步,cronAction()里就拿不到配置值;cronAction()是真正被调度执行的逻辑,数据库清理、报告生成、数据同步这类不干扰用户交互的操作都放这里。最常见的错误是把业务逻辑写进init(),结果任务一加载就执行、而不是按调度执行。另外要意识到后台任务运行在系统级上下文里,它和前台请求共享缓存机制,数据变化时缓存会自动重载,所以任务里改数据后不必手动刷缓存,但要注意并发场景下的事务边界。
4.2 数据库配置:对象、属性、索引、关系四件套
数据库配置的界面部分围绕四件事:新建对象、创建对象属性、索引和关系。这四件套的顺序不能乱——先有对象,才有属性;属性和关系定了,索引才有意义。更新数据库则分两步:先打开管理方式,再应用配置变更、开始配置数据库。这两步的顺序是硬约束,跳过“管理方式”直接应用变更,配置不会真正生效。
复习时把这一章和 OR 持久化那条技术点连起来看:Maximo 提供系统级 OR 映射与持久化,持久层操作只需继承基类,所以数据库配置里定义的对象和属性,最终会映射到 psdi.mbo.* 的持久层行为上。理解了这层映射关系,就不会把数据库配置当成纯粹的 DBA 工作,它其实是 MBO 代码能跑起来的前提。
5. 代码开发与常用类:Mbo、MboSet、Fld 三件套怎么记
5.1 MboSet:持久层核心类的固定写法
MboSet 是持久层核心类,核心超类是 psdi.mbo.MboSet。应用程序对象与 MboSet 直接关联,创建对象时必须指定关联的 MboSet 类;MboSet 类必须继承 psdi.mbo.MboSet 并实现 psdi.mbo.MboSetRemote 接口,同时必须定义构造方法、实现 getMboInstance 方法返回 Mbo 实例。
package maxdemo.lesson1; import java.rmi.RemoteException; import psdi.mbo.Mbo; import psdi.mbo.MboServerInterface; import psdi.mbo.MboSet; import psdi.util.MXException; public class CustDemoMboSet extends MboSet implements CustDemoMboSetRemote { private static final long serialVersionUID = 3918526761961603733L; // 构造方法:必须定义,传入 MboServerInterface public CustDemoMboSet(MboServerInterface arg0) throws RemoteException { super(arg0); } // 返回 Mbo 实例,框架据此创建单条记录对象 protected Mbo getMboInstance(MboSet arg0) throws MXException, RemoteException { return new CustDemoMbo(arg0); } }三个要点:构造方法必须定义且调用父类构造;getMboInstance是框架创建单条 Mbo 的工厂方法,返回类型是 Mbo;serialVersionUID因为走 RMI 远程调用,序列化标识不能省。这段骨架几乎每份 MboSet 都一样,记住它,剩下就是往里填业务方法。
5.2 Mbo 与 Fld:业务逻辑与字段级校验的分工
Mbo 例子和 FldXX 例子代表两个层级:Mbo 承载单条记录的业务逻辑,FldXX 承载字段级的行为与校验。复习时不要把它们当成三份并列的代码模板,而要理解成“集合 → 单条 → 字段”的逐层细化。MboSet 管一组记录(比如一个列表),Mbo 管其中一条,Fld 管这条记录里的某个字段。写校验时先问自己:这个规则是针对整个集合、单条记录,还是单个字段?答案决定了代码写在哪一层。放错层级的典型后果是校验被绕过,或者同一规则在多处重复。
5.3 常用类方法:按“生命周期、状态判断、取值赋值”三组记
Mbo 与 MboSet 的常用方法加起来几十个,硬背效率极低。按用途分三组,记忆负担立刻下降。
第一组是生命周期与持久化:add()新增、copy()复制、delete()删除、save()保存、commit()提交、close()关闭、cleanup()清理、clear()清空、rollbackToCheckpoint()回滚到检查点、modify()修改。这一组要特别注意 save/commit/close 的区别,以及 rollbackToCheckpoint 依赖检查点的前提。
第二组是状态判断:isModified()与isModified(attribute)判断是否修改(整体或单字段)、isNew()是否新建、isNull(attributeName)字段是否为空、isSelected()是否选中、toBeAdded()、toBeUpdated()、toBeDeleted()、toBeSaved()表示待处理状态。这一组的坑在于“待处理状态”和“已落库状态”不是一回事,判断时机错了结论就反了。
第三组是取值赋值与标志位:getXXXX(attributeName)按属性取值、setValue(name, attributeName)赋值、setValueNull(attributeName)置空、setFieldFlag(attributeName, flag, state)设字段标志、setFlag(flag, state)设对象标志、checkFieldAccess()检查字段访问权限、canDelete()是否可删、appValidate()应用校验、getThisMboSet()取所属集合、getInitialBaseLanguageString()取初始基础语言串、getInsertCompanySetId()取插入公司集合 ID、init()与initialize()初始化。这一组里setFieldFlag和setFlag最容易混:前者针对字段,后者针对对象;checkFieldAccess则常被忘在权限相关逻辑里。
6. 易错点清单:这五处最容易在复习和实操中翻车
易漏点一:把 MXServer 的系统服务和应用服务混为一谈。为什么漏:两者都在启动时初始化,文档描述又挨在一起。怎么补:记住系统服务是连接池、缓存、数据字典加载、RMI 注册、线程管理这类“框架级”能力,应用服务才是业务 MBO;排错时先判断是框架没起来还是业务逻辑错。
易漏点二:条件节点只画一条连接。为什么漏:直觉上“条件成立走这边”就够了。怎么补:条件节点必须一正一反两条连接,SQL 表达式解析为真走正连接、为假走负连接,缺一条流程就会卡死。
易漏点三:后台任务把逻辑写进 init()。为什么漏:骨架代码里 init 在前,顺手就写了。怎么补:init 只做参数初始化,业务逻辑一律放 cronAction,否则任务加载即执行,调度形同虚设。
易漏点四:数据库配置跳过“管理方式”直接应用变更。为什么漏:界面按钮看起来可以直接点。怎么补:固定顺序是先打开管理方式、再应用配置变更,顺序反了配置不生效,这是纯操作习惯问题。
易漏点五:MboSet 忘记实现 getMboInstance 或漏掉 serialVersionUID。为什么漏:编译能过,运行时才报错。怎么补:把“继承 MboSet、实现 Remote 接口、定义构造方法、实现 getMboInstance、声明 serialVersionUID”当成五件套检查项,写完对照一遍。
7. 复习落地:一份可执行的查漏补缺路线
复习这件事,最怕的是把目录从头翻到尾、合上书还是说不出所以然。我的做法是把这份培训拆成三轮,每轮目标不同,用一张表锁住节奏。
| 轮次 | 目标 | 具体动作 | 验收标准 |
|---|---|---|---|
| 第一轮 | 建地图 | 只看章标题和分层:技术底座、程序结构、页面、工作流、后台任务、数据库、代码开发 | 能口述七块内容各自解决什么问题 |
| 第二轮 | 填细节 | 逐章过表格与代码骨架,重点看第 2、3、5 章的对比表 | 能默写 MboSet 五件套、工作流节点约束 |
| 第三轮 | 查漏洞 | 对照第 6 章五条易错点逐条自问,答不上就回对应章 | 五条全部能说出“为什么漏、怎么补” |
三轮之外,还有两个具体技巧值得试。第一个是“反向读代码”:拿到一段 MboSet 或 Crontask 代码,先不看注释,自己判断它属于哪一层、生命周期方法有没有用错、状态判断的时机对不对,再对照原文验证。第二个是“节点默画”:合上资料,在纸上画出开始、任务、条件、子过程、停止五个节点的最小闭环,标出每个节点的连接约束,画不出来的地方就是工作流这章的真实漏洞。
还有一个习惯救过我很多次:凡是涉及顺序的操作——数据库配置的“管理方式 → 应用变更”、MboSet 的 save → commit → close、工作流的条件真假分支——我都强制在草稿上写出顺序再动手,因为这类错误不是理解问题,而是手快导致的翻车。从那以后我每次复习到这几处,都强制走一遍“先写顺序、再对照原文”的流程,比反复看十遍都管用。这份 Maximo 入门培训的完整梳理就到这里,希望帮到你。
本文还有配套的精品资源,点击获取