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
分享到:
相关推荐
hhhhh安卓开发教程大全
avem-labs_Avem_1740990015.zip
微信群机器人管理系统源码 微信群机器人管理系统源码 支持同登陆多个微信 源码类型: C/S 开发环境: VS2010 SQL2008R2 菜单功能 1、支持同时登录多个微信 2、支持机器人聊天(笑话,成语接龙、故事会、智力等等) 3、支持签到 4、可自定义回复 5、可自定义红包语 6、支持定期发送公告(如群规,广告)等 1、WeChatRobots后台配置web版 2、数据库在WeiChartGroup.Net/app_data中,附加即可
https://upload.csdn.net/creation/uploadResources?spm=1003.2018.3001.4314
名字微控制器_STM32_课程_DeepBlue_1740989720.zip
S7-200Smart恒压供水程序示例与485通讯实践:操作指南与案例解析,S7-200 Smart可编程控制器恒压供水程序设计与实现,附带485通讯范例,S7-200Smart 恒压供水程序样例+485通讯样例 ,S7-200Smart; 恒压供水程序样例; 485通讯样例,S7-200Smart程序样例:恒压供水及485通讯应用示例
Java使用JNA、JNI两种不同方式调用DLL、SO动态库方式读写M1卡源码,支持读写M1卡扇区数据、修改IC卡扇区密钥、改写UID卡卡号等功能,支持Windows系统,同时支持龙芯Mips、LoongArch、海思麒麟鲲鹏飞腾Arm、海光兆芯x86_Amd64等架构平台的国产统信、麒麟等Linux系统,内有jna-4.5.0.jar包,vx13822155058 qq954486673
UDP协议接收和发送数据示例JAVA
本文介绍了范德堡大学深脑刺激器(DBS)项目,该项目旨在开发和临床评估一个系统,以辅助从规划到编程的整个过程。DBS是一种高频刺激治疗,用于治疗运动障碍,如帕金森病。由于目标区域在现有成像技术中可见性差,因此DBS电极的植入和编程过程复杂且耗时。项目涉及使用计算机辅助手术技术,以及一个定制的微定位平台(StarFix),该平台允许在术前进行图像采集和目标规划,提高了手术的精确性和效率。此外,文章还讨论了系统架构和各个模块的功能,以及如何通过中央数据库和网络接口实现信息共享。
图像识别”项目源码资源(Python和C++)
虚拟同步电机与并电网模型的Simulink仿真参数配置与直接使用指南,虚拟同步电机与并电网模型的Simulink仿真:参数齐全,直接使用,同步电机simulink仿真 并电网模型仿真 参数设置好了,可直接使用 ,虚拟同步电机; simulink仿真; 并电网模型仿真; 参数设置; 使用,虚拟同步电机Simulink仿真与并电网模型参数化应用
三菱FX3U与力士乐VFC-x610变频器通讯案例详解:PLC控制下的变频器操作与设置程序,含接线方式及昆仑通态触摸屏操作指南,三菱FX3U与力士乐VFC-x610变频器通讯案例详解:接线、设置与程序注解,实现频率设定、启停控制与实时数据读取功能。,三菱FX3U与力士乐VFC-x610变频器通讯程序三菱FX3U与力士乐VFC-x610变频器通讯案例程序,有注释。 并附送程序,有接线方式,设置。 器件:三菱FX3U的PLC,力士乐VFCx610变频器,昆仑通态,威纶通触摸屏。 功能:实现频率设定,启停控制,实际频率读取等。 ,三菱FX3U;力士乐VFC-x610变频器;通讯程序;案例程序;注释;接线方式;设置;频率设定;启停控制;实际频率读取;昆仑通态;威纶通触摸屏。,三菱FX3U与力士乐VFC-x610变频器通讯程序及案例:频率控制与读取实践
xmselect测试用例~~~~~~~~~~~~~~
总共包含 32 款 AAA 级科幻武器。四种武器类型,每种有 8 种不同的纹理变化! 所有内容均采用 PBR 材质,可直接用于开发游戏!
python词云生成器,将txt文本自动分割生成词云图
智慧园区,作为现代城市发展的新形态,旨在通过高度集成的信息化系统,实现园区的智能化管理与服务。该方案提出,利用智能手环、定制APP、园区管理系统及物联网技术,将园区的各类设施与设备紧密相连,形成一个高效、便捷、安全的智能网络。从智慧社区到智慧酒店,从智慧景区到智慧康养,再到智慧生态,五大应用板块覆盖了园区的每一个角落,为居民、游客及工作人员提供了全方位、个性化的服务体验。例如,智能手环不仅能实现定位、支付、求助等功能,还能监测用户健康状况,让科技真正服务于生活。而智慧景区的建设,更是通过大数据分析、智能票务、电子围栏等先进技术,提升了游客的游玩体验,确保了景区的安全有序。 尤为值得一提的是,方案中的智慧康养服务,展现了科技对人文关怀的深刻体现。通过智慧手环与传感器,自动感知老人身体状态,及时通知家属或医疗机构,有效解决了“空巢老人”的照护难题。同时,智慧生态管理系统的应用,实现了对大气、水、植被等环境要素的实时监测与智能调控,为园区的绿色发展提供了有力保障。此外,方案还提出了建立全域旅游营销平台,整合区域旅游资源,推动旅游业与其他产业的深度融合,为区域经济的转型升级注入了新的活力。 总而言之,这份智慧园区建设方案以其前瞻性的理念、创新性的技术和人性化的服务设计,为我们展示了一个充满智慧与活力的未来园区图景。它不仅提升了园区的运营效率和服务质量,更让科技真正融入了人们的生活,带来了前所未有的便捷与舒适。对于正在规划或实施智慧园区建设的决策者而言,这份方案无疑提供了一份宝贵的参考与启示,激发了他们对于未来智慧生活的无限遐想与憧憬。
使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知,构建实时应用程序已成为现代 Web 开发中必不可少的部分,尤其是对于通知、聊天系统和实时更新等功能。SignalR 是 ASP.NET 的一个强大库,可实现服务器端代码和客户端 Web 应用程序之间的无缝实时通信。 参考文章:https://blog.csdn.net/hefeng_aspnet/article/details/145990801
自适应网址导航网站发布页单页网页模板html源码,超级好看自适应清新网址导航网站发布页单页网页模板html源码!无论电脑还是手机,这是一个网页单页源码!! 模板无后台模板,无需数据库,上传服务器直接能用。
不用花钱,不拐弯抹角。
三菱FX3U PLC画圆程序详解:子程序循环插补技术绘制高精度圆及其他图形,三菱FX3U PLC画圆程序详解:以子程序循环调用实现高精度图形插补技术,三菱FX3U的plc画圆程序,程序将圆分为360等份进行插补,才用子程序循环调用的方式,根据这个原理可自行编写多种图形的程序 ,三菱FX3U; PLC画圆程序; 圆等份插补; 子程序循环调用; 图形程序编写,三菱FX3U PLC画圆子程序插补,多图形绘制可自定义调用循环编程法