论坛首页 Java企业应用论坛

CC&B核心模块——Batch(批服务)

浏览 2621 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-26  

CC&B平台开发中,BATCH是少不了的,CC&BBATCH支持JAVACOBOL两种语言开发的程序,这里只介绍JAVA开发的BATCH。但系统中核心部份的BATCH大部分是采用COBOL开发,属于出厂时已经存在的。

 

 

1.       BATCH的功能:

BATCH()是一种离线的批处理程序,可以单独运行,不依赖WEB服务,是用来执行各类批量业务数据的程序。BATCH具有灵活,重复使用等特点,多个批服务串联到一起成为一个任务流(Job Stream)来处理一系列的后台业务。

2.       命名规范

 

  



 
 

说明:

1.       Name : 是程序类命,CmlQueryAccountInformationBatchCml开头Batch结尾,CmlCmCore Model/核心模块llocal/本接化Batch结属表明这个类是一个Batch程序。

2.  Multi Threaded/Rerunnable勾选说明这个Batch支待多线程。

3.     Worker Class Name是内部类的名字,这里输入的同类命一样,但在后面加上Worker,变成CmlQueryAccountInformationBatchWorker,工具生成出来的代码有个小bug,在内部类的继承类前多写了一个类名,CmlQueryAccountInformationBatchWorkerCmlQueryAccountInformationBatchWorker_Gen,因此需要手工去掉前面一部份。

4Single record per unit 是否单个记录执行。

3.       程序结构

A: 版权声明注释, 三个部分,第一部份版权说明,第二部份程序描述,第三部份修改记录。

 

 

/*
 **************************************************************************
 *                Confidentiality Information:                    
 *                                                                
 * This module is the confidential and proprietary information of 
 * XXX; it is not to be copied, reproduced, or         
 * transmitted in any form, by any means, in whole or in part,    
 * nor is it to be used for any purpose other than that for which 
 * it is expressly provided without the written permission of     
 * XXX.
 *                                                 
 *                                                                
 **************************************************************************
 *                                                                
 * PROGRAM DESCRIPTION:                                           
 * 
 * .
 *
 **************************************************************************
 *                                                                
 * CHANGE HISTORY:                                                
 *                                                                
 * Date:        by:     Reason:                                     
 * YYYY-MM-DD   IN      Reason text.    
 * 
 * 2010-04-26  Simon Hoo    Initial Version.
 **************************************************************************
 */

 

 

B:头注解:作者,是否多线程支持,参数。

其中参数部分,name是参数的名字,在SQL配置阶段按照这个来配,required该参数在运行时是否必须给值,type,参数类型,除JAVA基本类型Stringinteger外,还可以是entity 类型,如果定义entity类型,必须指定entityName.

 

 

 

 

如何查找entityName,如果对CC&B系统熟悉,根据CC&B的命名规范很容易猜出是什么,最准确的办法是,在CC&B的英文界面,找到要配置的参数前面的英文描述,在Oracle提供的数据字典中找到表名,然后根据表名在系统中找到对应的JAVA对象名。

 

 

 
 

 

 

 

 

C. 外部类参数变量和工作临时变量,注意注释说明

 

//~ soft parameter.
private CustomerClass customerClass;
private AccessGroup accessGroup;
	
//~ working parameter.
private static final Logger logger = LoggerFactory.getLogger(CmlQueryAccountInformationBatch.class);
private int index;
	

 

 

 

D. 初始化和验证参数是滞有效: validateSoftParameters(),此方法最早执行。

 

@Override
public void validateSoftParameters(boolean isValidate) {
	this.customerClass = getParameters().getCUST_CL();
	this.accessGroup = getParameters().getACCESS_GUP();
		
	if(isNull(customerClass)){
		addError(MessageRepository.softParmMissingFromAnnotation("CUST_CL"));
	}
		
	if(isNull(accessGroup)){
		addError(MessageRepository.softParmMissingFromAnnotation("ACCESS_GUP"));
	}
}

 

 

 

E. 外部类的getJobWork()方法,此方法在初始化完成后运行,相当于普通JAVA类的main()方法。通常情况下,在这个方法中,将要处理的数据,全部查询出来。然后交给内部类一条一条的去处理。

 

 

public JobWork getJobWork() {
	String hqlStr = "FROM Account account" +
			" WHERE account.customerClass = :customerClass " +
			" AND account.accessGroup = :accessGroup";
	Query queryRecord = this.createQuery(hqlStr);
		
	return createJobWorkForEntityQuery(queryRecord);
}

 

 

 

F. 使用getThreadWorkerClass()方法得到内部类的实例对象(使用CC&B内部机制)

 

public Class<CmlQueryAccountInformationBatchWorker> getThreadWorkerClass() {
	return CmlQueryAccountInformationBatchWorker.class;
}

 

 

 

G. 内部类,内部类用于执行外部类查询出来的结果,通常都要是一条记录一条记录来处理。同样,内部类里面也有几个系统内置的方法,结构如下:

 

 

G.1. 内部类参数变量和工作临时变量,注意注释说明, 这要要说明一下,内部类不要使用外部类的全局变量,以往的经验,会有NullpointException的风验。

 

//~ soft parameter
private CustomerClass customerClass;
private AccessGroup accessGroup;
		
//~ working parameter
private int temp_index;

 

 

 

G.2. 初始化和验证参数变量

 

 

@Override
public void initializeThreadWork(boolean isInitialize) throws ThreadAbortedException, RunAbortedException {
	this.customerClass = getParameters().getCUST_CL();
	this.accessGroup = getParameters().getACCESS_GUP();
			
	if(isNull(customerClass)){
		addError(MessageRepository.softParmMissingFromAnnotation("CUST_CL"));
	}
			
	if(isNull(accessGroup)){
		addError(MessageRepository.softParmMissingFromAnnotation("ACCESS_GUP"));
	}
}

 

 

 

G.3. 指定事务的提交策略。(三种)

 

public ThreadExecutionStrategy createExecutionStrategy() {
	return new CommitEveryUnitStrategy(this);
	//return new SingleTransactionStrategy(this);
	//return new StandardCommitStrategy(this);
}

 

 

G.4. 直正执行任务

 

public boolean executeWorkUnit(ThreadWorkUnit unit)
	throws ThreadAbortedException, RunAbortedException {
	// do anything.
			
	return false;
}

 

 

G.5. 最终退出之前处理

 

@Override
public void finalizeThreadWork() throws ThreadAbortedException, RunAbortedException {
	super.finalizeThreadWork();
}

 

 

4.       开发说明

1,   在注解中的Batch参数定义好之后,并且将内部类的超类的名字修改正确后,要生成外部类和内部类的GEN类,然后清理整个项目,最后刷新项目即可进行业务逻辑的编码。



 

 

 

2,   内部类和外部类的变量不要共用。

3,   所有的参数,一定要在初始化之后验证。

4,   尽理在外部类的getJobWork()方法中一次性把查出的数据过滤完成,不要放在内部类中去过滤每条数理该不该处理,内部类严格上来说对每条记录都做处理。

5.       注册

将已开发好的BATCH注册到CC&B的数据库中。

步骤: A. 将已开发好的BATCH程序发布到WEB服务器,并启动WEB服务器;

            B. CC&B页面管理菜单/系统下,添加Batch Control/批控制。



 

 

 

6.       调试(前提是已发布的程序所在的BATCH服务已正确启动)

A. 命令行调式

命令行提交,按照页面提交所需要的元素值,填写到配置文件,然后运行BATCH提交命令。

 

 
 

B. 页面提交

在页面点提交就行,这里不多说。

 

  • 大小: 27.6 KB
  • 大小: 49.9 KB
  • 大小: 38 KB
  • 大小: 34.9 KB
  • 大小: 27.3 KB
  • 大小: 37 KB
  • 大小: 41.6 KB
  • 大小: 40.5 KB
  • 大小: 27 KB
  • 大小: 62.5 KB
  • 大小: 35.6 KB
  • 大小: 24.8 KB
  • 大小: 41 KB
  • 大小: 29.3 KB
  • 大小: 16.2 KB
  • 大小: 27.1 KB
  • 大小: 51.7 KB
  • 大小: 21.5 KB
  • 大小: 17.7 KB
  • 大小: 16.5 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics