## 一、概述
实际的业务中,我们会经常遇这样一种业务场景,它存在处理大量数据等耗时的任务,这些任务必须在某个时段范围或某些时段范围被处理,产生结果。从技术角度来看,这种场景如果直接在主业务程序中开发并部署,容易导致业务应用系统的耦合以及由于突发的大计算量导致的主业务运行不稳定。
基于这种技术和运维的考虑,基于技术平台,我们研发了自主的调度容器组件来解决这种应用需求。
![](https://img.kancloud.cn/69/bd/69bd9e7f0b94abe6ca9c00589f45e644_1123x794.png)
## 二、技术特性
与主应用可分离独立运行;
技术平台所有基层设施可全面复用;
灵活的调度定制;
可在主应用中监控运行;
可靠的异常处理和干预机制;
与外部业务系统的集成能力;
## 三、开发教程
平台对调度服务的支持,提供了一套完整的运行体系;一般分成三层架构,包括job、manger和logic(考虑事务的灵活性,增加transactionalapi层);
调用关系如:Job--->Manager--->Logic--->transactionalapi;
开发工作,也就是针对上述逻辑代码及配置文件(一般复用业务的applicationContext-*.xml配置文件);
以下举例,从零开始,在既有项目中,开发一个job的完整过程;
### **job**
```
public class ComputeDynamicStoreJob extends UniframeworkTimerJob
{
@Override
public void doBusinessLogic(JobExecution jobexecution) throws Exception
{
ComputeDynamicStoreLogic.execute((JobManager) getJobManager("noTransactionJobManager"), jobexecution);
}
@Override
public long getDelayTime()
{
return MINUTE * 1;
}
@Override
public long getPeriodTime()
{
return MINUTE * 2;
}
@Override
public boolean multiInstanceEnabled()
{
return false;
}
@Override
public boolean scheduleEnabled()
{
return true;
}
@Override
public String desc()
{
return "计算动态库存";
}
@Override
public String allowedIps()
{
return null;
}
}
```
| 方法 | 用途 | 说明 |
| --- | --- | --- |
| doBusinessLogic| 核心业务逻辑 |这里是job中执行业务逻辑的代码入口|
| getDelayTime | 设定执行延迟时间 |设定时间之后,调度才启动|
| getPeriodTime| 设定执行间隔时间 |设定调度的间隔时间|
| multiInstanceEnabled| 是否支持同时多个实例允许 |一般设置为false|
| scheduleEnabled| 是否启用 |仅启用才会加载|
| desc| 当前调度的描述信息 |描述信息 |
| allowedIps| 设定允许执行当前调度的IP |如果当前仅部署在一台服务器,则可设置为null
### **logic/transactionalapi**
这里是业务的核心代码,含logic及transactionalapi;
ComputeDynamicStoreLogic :
```
public class ComputeDynamicStoreLogic extends JobLogicSupport
{
public static void execute(JobManager manager, JobExecution jobexecution) throws Exception
{
ComputeDynamicStoreApi api = getJobLogicTransactionalApi("computeDynamicStoreApi");
api.doProcess(manager, material, jobexecution);
}
}
```
ComputeDynamicStoreApi :
```
public class ComputeDynamicStoreApi extends JobLogicTransactionalApi
{
public void doProcess(JobManager manager, DataMaterial material, JobExecution jobexecution) throws Exception
{
//真正核心的业务代码
}
}
```
### **manager**
```
public class JobManager extends JobManagerSupport
{
//定义项目级的JobManager
}
```
这个代码,在既有项目中,不需要再额外开发,全项目共享;
### **配置文件**
1、上述几个核心文件,transactionalapi必须配置到applicationContext-*.xml(可在项目工程中,任选一个一定被加载的applicationContext-*.xml文件)中,才能生效;
例如:
```
<bean id="computeDynamicStoreApi" parent="BaseServiceProxy">
<property name="target">
<bean class="com.erp.common.job.logic.transactionalapi.ComputeDynamicStoreApi"></bean>
</property>
</bean>
```
2、为了jobserver能正常加载上述配置,需要将配置applicationContext-*.xml设置到uniframework.properties的server.jobserver.loadedctx,取名为仅仅取applicationContext-之后的名称,如:applicationContext-card.xml,则取名为card,如果有多个,则用|分开;
例如:
```
server.jobserver.loadedctx = card|nav
```
### **打包部署**
到这里,一个完整的业务job,就全部开发完毕,打包部署,即可运行;
>[danger]
> 1、一般的,每个工程,都会有一个业务代码以及配置文件的jar包,比如,unerp4job.jar,包里面包含了工程所有的源码及配置文件;
> 2、那么,在开发完毕,就把**所有**的工程文件重新打一个unerp4job.jar包,即可;
> 3、将该包替换掉jobserver/lib中的同名文件,重启即可;
>
更具体的信息参考:[调度服务器](../../%E4%BA%A7%E5%93%81%E5%AE%9E%E6%96%BD/%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7/%E8%B0%83%E5%BA%A6%E6%9C%8D%E5%8A%A1%E5%99%A8.md)
- 前言
- 01、系统平台
- 系统管理
- 组织类型
- 单位管理
- 基本功能
- SAAS功能
- 组织管理
- 角色管理
- 人员管理
- 账号管理
- 账户体系
- 账号绑定
- 账号锁定
- 团队管理
- 模板管理
- 补丁管理
- 字段管理
- 静态字典
- 动态字典
- 系统配置
- 菜单配置
- 路由配置
- 编码规则
- 访问控制
- 系统参数
- 字典配置
- 参数定义
- 参数配置
- 属性定义
- 属性设置
- 树形定义
- 树形设置
- 系统监控
- 业务维护
- 工作监控
- 调度监控
- 导入监控
- 日志管理
- 在线监控
- 附件管理
- 附件监控
- 附件应用
- 附件授权
- 上传监控
- 字段监控
- 系统提醒
- 场景配置
- 事件监控
- 提醒记录
- 事件历史
- 日期设置
- 节假日期
- 工作时间
- 日历编制
- 工作日历
- 开放平台
- 微信应用
- 配置信息
- 更新菜单
- 钉钉应用
- 配置信息
- 开放服务
- 应用设置
- 服务管理
- 请求监控
- 请求跟踪
- 移动应用
- 发布管理
- 导航菜单
- 个人管理
- 个人资料
- 内部消息
- 短信中心
- 流程管理
- 流程定义
- 流程环节
- 处理人
- 流程提醒
- 流程签收
- 流程目录
- 流程微调
- 转移动作
- 定义校验
- 流程绑定
- 流程实体设定
- 单业务多流程
- 动态表单绑定
- 环节字段设定
- 转移路由设定
- 流程监控
- 流程催办
- 流程会话
- 流程启动
- 通用待办
- 流程驱动
- 通用已办
- 示范实例
- 流程启动
- 流程待办
- 流程已办
- 常见问题
- 表单管理
- 预留字段
- 字段定义
- 业务应用
- 动态辅表
- 辅表定义
- 辅表应用
- 辅表监控
- 动态主表
- 主表定义
- 业务定义
- 元数据
- 产生机制
- 应用场景
- 02、技术平台
- 重要组件
- 表单引擎
- 流程引擎
- 基础设施
- 系统安全
- 服务集成
- 核心组件
- 核心平台
- 调度容器
- 代码调试
- 相关配置
- 常见问题
- 多线程
- 工作容器
- 开放服务
- 富客户端
- 代理容器
- https
- SSLPinning
- 03、手机应用
- 参数配置
- 技术平台
- 功能设计
- 系统功能
- 应用升级
- 业务模块
- 04、微信应用
- 参数配置
- 多公众号
- 技术平台
- 业务功能
- 平台功能
- 微信客服
- 微信公号
- 05、开放服务
- 接入示例
- 实施方案
- nginx安装
- nginx配置
- nginx运行
- nginx限流
- 实现方案
- 业务操作
- 代码示意
- 06、常见问题
- 性能优化
- 启动优化
- 解决方案
- 实体操作冲突
- 算法说明
- 检验算法
- 注意事项
- 浏览器
- 插件
- 邮箱配置
- 系统维护
- 维护日志
- 维护脚本
- 开发环境
- 07、版权信息
- 平台版权
- 产品版权
- 后记