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
分享到:
相关推荐
Origin教程009所需练习数据
内容概要:本文提出了一个新的激活函数dReLU,用于提高大语言模型(LLM)的稀疏激活水平。dReLU可以显著减少模型推理过程中激活的参数数量,从而实现高效的模型推理。通过在Mistral-7B和Mixtral-47B模型上的实验,验证了dReLU的有效性。结果表明,使用dReLU的模型在性能上与原始模型相当甚至更好,同时减少了计算资源的需求,达到了2-5倍的推理加速。 适合人群:对深度学习、大语言模型和模型优化感兴趣的机器学习研究人员和技术开发者。 使用场景及目标:适用于需要高效推理的大语言模型应用场景,特别是资源受限的设备,如移动电话。目标是减少模型的计算资源消耗,提高推理速度。 其他说明:本文详细探讨了dReLU的设计和实验验证,提供了大量的实验数据和对比结果,展示了dReLU在多种任务上的优越表现。
最近参加一个农业机器人的比赛,由于今年的题目是蔬菜幼苗自动搬运,因此搬运部分需要用到一个三轴运动的装置,我们参考了3D打印机的原理,上面通过步进电机控制丝杆和皮带从而带动我们的抓手来抓举幼苗。因为比赛的幼苗和幼苗的基质比较小,这个过程需要精度比较高,查询了一些资料后,我想到了用dma来给STM32单片机的定时器寄存器ARR发送数据来精准控制输出pwm的数量,从而可以精准控制步进电机转动的度数,可以十分方便的计算出到某个位置需要的脉冲。
白色大气风格的商务团队公司模板下载.zip
2023-04-06-项目笔记-第三百五十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.356局变量的作用域_356- 2024-12-25
白色大气风格的个人摄影图片博客网站源码下载.zip
白色大气风格的木材加工行业网站模板下载.zip
PCle AI加速卡在智能制造中的应用.docx
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色风格的后台管理系统模板下载.rar
内容概要:本文详细介绍了网络热点采集系统的开发过程,包括网页抓取、数据去重、清洗、分类和可视化的各个环节。系统使用 Python 的 requests 和 BeautifulSoup 库抓取指定关键词相关的网页内容,通过集合数据结构去重,利用正则表达式清洗数据,根据关键词匹配进行分类,最后通过 matplotlib 和 wordcloud 库进行数据可视化,展示热点信息。此外,文章还介绍了多线程抓取、数据缓存、异常处理等性能优化方法,以及系统的部署和运行步骤。 适合人群:具有 Python 编程基础的开发人员和技术爱好者。 使用场景及目标:该系统适用于需要实时监控网络热点话题的个人或企业,帮助他们快速了解和分析热点信息的趋势和分布,辅助决策。 阅读建议:在学习本文时,建议读者跟随每一步代码实现,理解各个模块的设计思路和技术细节,并尝试在自己的环境中搭建和运行整个系统,以便更好地掌握网络热点采集系统的开发流程。
白色大气风格的KTV美女麦霸网站模板下载.zip
白色简洁风的博客网站模板下载.zip
梧州市五险一金办事指南
白色简洁风格的餐厅服务团队整站网站源码下载.zip
白色大气风格的境外游景区模板下载.zip
白色大气风格的美食厨师展示模板下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的视察滚动房地产模板下载.zip
【要点】:本文提出LLM-Select方法,利用大型语言模型(LLM)在仅提供输入特征名称和预测任务描述的情况下,实现特征选择,其性能可媲美传统数据科学工具,并具有跨查询机制和提示策略的一致性。 【方法】:通过零样本提示(zero-shot prompt)LLM输出特征的重要性分数,实现特征选择。 【实验】:在真实世界数据集上进行广泛实验,结果表明基于LLM的特征选择在性能上与LASSO等数据驱动方法相当,且无需查看下游训练数据。