`
frankensteinlin
  • 浏览: 56420 次
  • 性别: Icon_minigender_1
  • 来自: ShangHai
社区版块
存档分类
最新评论
阅读更多

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。

  • recv_job的程序结构

      

    一个负责接收数据的recvjob需要四个组件:

  •    IReader负责读取文件,并且解析文件,将文件的内容解析组织成一组IFileMapperdObjectd对象,以iterator的方式返回。
  •    Iwriter负责将一个个IFileMapperdObjectd对象序列化到数据库中去。
  •    IFileResourceInfo负责保存读取文件的路径,以及backup或者error的路径
  •    BatchMail组件负责邮件的发送工作。
  •   IOneFileMappedObject可以是一个peer对象,也可以是一组peer对象。

    具体的工作流程是:

  1.    IReader读入文件组织成IFileMapperdObjectd对象,逐个返回给IWriter
  2.    IWriter将每个IOneFileMappedObject对象序列滑到数据库
  3.    如果失败都会调用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";
	}
  •  默认的reader组件

      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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics