CeBatch
public class JobWorker {
public void work(String jobName) throws Exception {
IJob job;
ApplicationContext ctx = AppContextUtils.getResource();
job = (IJob) ctx.getBean(jobName);
try {
job.work();
} catch (RuntimeException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
AppContextUtils 会根据 header.properties 中的 namespace 的设置去load不同的文件.进行初始化。
- namespace=test loading [test_all.xml] test_*.properties files 用于本机测试用。
- namespace=linux loading [linux_all.xml] linux_*properties files 用于linux模拟环境测试
- namespace=live loading [live_all.xml] live.properties 用于本番
Sample (linux_all.xml):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true">
<import resource="linux_property.xml"/>
<import resource="appContext.xml"/>
<import resource="wwlhf590.xml"/>
<import resource="wwlhf600.xml"/>
<import resource="wwlhf610.xml"/>
<import resource="wwlhf650.xml"/>
<import resource="wwlhf670.xml"/>
<import resource="wwlef320.xml"/>
<import resource="jobdel.xml"/>
</beans>
linux_property.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:linux_db_server.properties</value>
<value>classpath:linux_mail.properties</value>
<value>classpath:message.properties</value>
<value>classpath:linux_teststate.properties</value>
<value>classpath:linux_filefolder.properties</value>
</list>
</property>
</bean>
</beans>
(linux ,test ,live)_all.xml的区别主要就是:<import resource="linux_property.xml"/> 他们load的property文件不同 其他都应该是一样的。
所以大家注意:各个不同程序的xml配置文件应该同时在三个_all.xml中import。
一个负责接收数据的recvjob需要四个组件:
- IReader负责读取文件,并且解析文件,将文件的内容解析组织成一组IFileMapperdObjectd对象,以iterator的方式返回。
- Iwriter负责将一个个IFileMapperdObjectd对象序列化到数据库中去。
- IFileResourceInfo负责保存读取文件的路径,以及backup或者error的路径
- BatchMail组件负责邮件的发送工作。
- IOneFileMappedObject可以是一个peer对象,也可以是一组peer对象。
具体的工作流程是:
- IReader读入文件组织成IFileMapperdObjectd对象,逐个返回给IWriter
- IWriter将每个IOneFileMappedObject对象序列滑到数据库
- 如果失败都会调用BatchMail发送邮件并且成功将文件移入backup目录,失败就移入error目录。
最主要的代码:
private Object workInTrasaction(TransactionStatus status) throws Exception {
try {
while (iReader.hasNext()) {
IOneFileMappedObject line = iReader.readOneobject();
iwriter.write(line);
}
move2BackupFoler();
} catch (ReadException e) {
LogUtil.error(e, "reading error ! \n file name :"
+ resourceInfo.getFileName() + " \n error Line is : "
+ e.getLineNo(), null);
sentMail(e);
move2ErrorFolder();
throw e;
} catch (Exception ex) {
LogUtil.error(ex, "error,file name " + resourceInfo.getFileName(),
null);
sentMail(ex);
move2ErrorFolder();
throw ex;
}
return "SUCCESS";
}
FileReader 一次性将文件读入内存,按行解析文件,将文件组织成一个IFileMappedObjects对象。IFileMappedObjects的iterator方法返回一个一个的IOneFileMappedObject .交给writer.
一个Filereader主要由三个组件组成:
- IFileResourceInfo :存放了需要读取的文件的位置,以及相关的路径信息。
- IFileMapperObjects :按行将OneLineRecord的数据Map成 一个或者一组IOneFileMapperdOjbect的数据 。一个IOneFileMapperdOjbect 存放了一组相同的invoice_no 或者ref_no的信息。
- ILineParser 用于按行解析数据,将解析好的文件放在OneLineRecord对象里面。OneLineRecord其实就是个Map的结构: key==>layout文件中的seq, value==>就是一个FieldValue对象。存放了数据格式的信息以及数据文件中对应的值,
下面是最重要的parseFile方法
private void parserFile() throws ReadException, IOException {
if (!fileResource.exist()) {
objIterator = new ArrayList().iterator();
return;
}
List lines = FileUtils.readLines(fileResource.getFile());
Iterator itor = lines.iterator();
int index = 0;
String oneLine = null;
try {
while (itor.hasNext()) {
oneLine = (String) itor.next();
String tmp=StringUtils.left(oneLine, 4);
if ( StringUtils.isBlank(oneLine)|| "%HD%".equalsIgnoreCase(tmp) || "%TR%".equalsIgnoreCase(tmp) ){
index++;
continue;
}else{
OneLineRecord oneLineRecord = lineParser.parse(oneLine, index);
fileMappedObjects.map(oneLineRecord);
index++;
}
}
} catch (ReadException ex) {
throw ex;
}catch (Exception ex) {
throw new ReadException("" + index, oneLine, ex);
}
LogUtil.debugObject(fileMappedObjects, null);
objIterator = fileMappedObjects.iterator();
}
首先读入文件,然后循环每一行: 解析成oneLineRecord ,map 到fileMappedObjects 对象中去。
以Wwlhf610为例说明 IFileMappedObjects的实现:
这是无法共通的部分,每个文件的格式不同,需要生成的表的对应关系也不同,所以每个不同的文件都需要实现一个自己的IFileMappedObjects,其他组件基本可以共用:
-
TableStructor 记录了Mappingsheet中的信息:字段名,对应layout的seq
- LinePeerMapper类 可以自动根据TableStructor 的信息收集将一行OneLineRecord对象映射为对应的Peer数据。
- Wwlhf610OneInvoce是IOneFileMappedObject对象的一个实例,它存储了映射后相同的Invoice的数据。
- IRcvTimesSeq用于seq自增长使用。
下面是最重要的map的实现:
public void map(OneLineRecord oneLineRecord) throws Exception {
LogUtil.debugObject(oneLineRecord, null);
CePackPeer peer = mapCePackPeer(oneLineRecord);
if (!containsCePackPeer(peer)) {
Wwlhf610OneInvoce oneInvoce = new Wwlhf610OneInvoce();
peer.setRcv_seq(seq.getSeq(peer.getIv_no()));
oneInvoce.setCePackPeer(peer);
wwlhf610OneInvoceMap.put(peer.getIv_no(), oneInvoce);
} else {
peer = getCePackPeer(peer.getIv_no());
}
Wwlhf610OneInvoce invoce = getInvoice(peer.getIv_no());
CePackCaseMarkPeer caseMarkPeer = mapCePackCaseMarkPeer(oneLineRecord);
caseMarkPeer.setRcv_seq(peer.getRcv_seq());
invoce.addCaseMarkPeer(caseMarkPeer);
CePackCaseMarkLinePeer caskMarkLinePeer = mapCePackCaseMarkLinePeer(oneLineRecord);
caskMarkLinePeer.setRcv_seq(peer.getRcv_seq());
invoce.addCaseMarkLinePeer(caskMarkLinePeer);
List caseMarkDtlList = mapCePackCaseMarkDtlPeer(oneLineRecord, peer
.getRcv_seq());
invoce.addCaseMarkDtlListPeer(caseMarkDtlList);
LogUtil.debugObject("mapping one line over ===============", null);
LogUtil.debugObject(invoce, null);
}
DbWriter组件
这个组件很简单就是将每个IOneFileMappedObject写入数据库:
public DbWriter() {
spMap.put("CRT_TM_STAMP", "CURRENT_TIMESTAMP");
spMap.put("UPDT_TM_STAMP", "CURRENT_TIMESTAMP");
spMap.put("DEL_FLG", "'0'");
spMap.put("CRT_USER", "'SYSTEM'");
spMap.put("UPDT_USER", "'SYSTEM'");
spMap.put("CPNY_CD", "'NEC'");
}
public void write(IOneFileMappedObject lineObj) throws Exception {
Iterator objItor=lineObj.iterator();
while(objItor.hasNext()){
mgr.insertByPeer(DataSourceUtils.getConnection(dataSource),
objItor.next(), null, spMap);
}
}
- 大小: 18.1 KB
- 大小: 24.5 KB
- 大小: 47.5 KB
分享到:
相关推荐
白色大气风格的建筑商业网站模板下载.rar
内容概要:本文详细介绍了面向对象编程语言Objective-C的基础语法,包括其历史背景、特点、环境搭建、基本语法、面向对象编程、高级特性和实际应用。具体涵盖的内容包括Objective-C的历史发展、面向对象编程的核心特性、变量和数据类型、控制结构、函数、数组和字典的使用,以及类、对象、属性和方法的定义与使用。此外,还介绍了高级特性如协议和委托、类别和扩展、ARC、块和GCD。最后,通过示例项目展示了如何在Xcode中创建和调试Objective-C程序,以及如何使用Cocoa和Cocoa Touch框架。 适合人群:具备一定的编程基础,希望学习或深入了解Objective-C编程的开发人员。 使用场景及目标:适用于需要开发macOS和iOS应用的开发者,帮助他们掌握Objective-C的基本语法和高级特性,提高编程效率和代码质量。 其他说明:本文不仅提供了详细的理论讲解,还通过实际代码示例展示了如何在Xcode中创建和调试Objective-C项目,适合初级到中级水平的开发人员学习和参考。
本次开发的微信小程球馆预约系统,有管理员,用户两个角色。管理员功能有个人中心,用户管理,场地类型管理,球馆信息管理,球馆预约管理,系统管理。用户可以在微信小程序上面注册登录,查看球馆信息,对球馆进行预约操作。 开发本程序后台用到了SSM开发技术,微信端用的是uni-app技术。数据库采用关系数据库市场占有率最高的MySQL作为本程序使用的数据库,完全符合程序使用并且有丰富的拓展余地。 用户在微信小程序注册登录后可以看到首页,首页可以搜索球馆名称,也可以查看球馆资讯,下面是导航栏。 用户点击球馆信息可以进行预约,预约需要输入相关时间等信息。 我的里面可以修改个人信息,可以退出,还可以查看球馆预约信息和我的收藏信息。
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。
廖鹏盛 - 时代进行曲.zip
白色大气风格的人体艺术摄影网站模板下载.zip
白色大气风格的服装设计师模板下载.zip
白色大气风格的景观设计HTML网站模板.zip
优质的机器学习资源是当今科技领域的热点,其中TensorFlow作为谷歌公司的开源库,成为最受欢迎的深度学习框架之一,广泛应用于各类项目中。TensorFlow提供了丰富的功能和灵活性,使得开发者可以轻松构建和训练复杂的神经网络模型,处理图像、文本和其他类型的数据。由于其开源性质,拥有庞大的社区支持,用户可以放心使用,并从开源社区中获取宝贵的经验和资源。 mnist数据集是机器学习领域的经典数据集之一。它包含着大量的手写数字图像,供开发者用来训练和测试各种算法和模型。这个数据集的规模相对较小,因此对于绝大多数人来说,无论是数据的下载还是训练过程,都不会对电脑性能提出过高的要求。这使得mnist成为了理想的入门数据集,适合初学者探索和理解机器学习算法的基本原理。 结合Pygame与TensorFlow,你将能够为机器学习实验创建出图形化界面,以及实现交互式处理。Pygame是一款面向游戏和多媒体应用的Python库,但同样也可以用于数据可视化和图形化交互。利用Pygame,你可以展示训练过程中的图像输出、模型的预测结果等,增强对机器学习算法运行情况的直观认识。而且,Pygame的简单。内
基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及转子位置 有效削弱抖振 赠送超螺旋滑模搭建推导文档及相关参考资料 仿真模型
汇编实验算数运算程序设计.docx
小区监控视频监控方案.doc
白色大气风格的HTML商务模板下载.zip
白色大气风格响应式运动健身瑜伽企业网站模板.zip
单片机实验仿真设计报告
白色大气风格的设计公司整站网站模板下载.zip
白色大气风格的html商务模板.zip
白色大气风格的英文网站模板下载.zip
白色大气风格的科研教育模板下载.zip
本摄像头ov7670驱动程序已经通过本人的验证可以正常运行,不同的stm32开发板只需要修改引脚即可使用