公司项目以前对文件大批量操作不是采用Spring Batch,而现在随着文件数的增多,原有文件批量处理的架构效率太低了,所以可能要用到Spring Batch来对文件来处理。现在的文件格式是首行代表的是批次信息,其余的行数代表的是订单信息。如果要用Spring Batch来处理的话,这种文件属于无格式文件中的多行文件。但是Spring Batch对这种文件的处理是要要在每一行的行首要有个标志才能挣钱解析,而现在公司的文件的第一行和其余的行数格式是一样的,唯一不一样的是参数个数不一样。所以我打算基于原有Spring Batch的基础上重写几个类就可以了。
项目结构如下:
主要是新加了以下3个类:
PatternMatcherByRow.java、PatternMatchingCompositeLineByRowMapper.java和PatternMatchingCompositeLineTokenizerByRow.java,然后再在batch.xml文件中做相关的配置就行了。
PatternMatcherByRow.java的内容主要如下:
package cn.lichunan.springbatch.override;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternMatcherByRow<S> {
private Map<String, S> map = new HashMap<String, S>();
private List<String> sorted = new ArrayList<String>();
public PatternMatcherByRow(Map<String, S> map) {
this.map = map;
// Sort keys to start with the most specific
sorted = new ArrayList<String>(map.keySet());
Collections.sort(sorted, new Comparator<String>() {
public int compare(String o1, String o2) {
String s1 = o1; // .replace('?', '{');
String s2 = o2; // .replace('*', '}');
return s2.compareTo(s1);
}
});
}
public S match(int lineNumber){
S value = null;
for (String key : sorted) {
System.out.println("->key:" + key);
if (PatternMatcherByRow.match(key, lineNumber)) {
value = map.get(key);
break;
}
}
if (value == null) {
throw new IllegalStateException("Could not find a matching pattern for key=[" + lineNumber + "]");
}
return value;
}
public static boolean match(String pattern, int lineNumber){
System.out.println("->pattern:" + pattern + "->lineNumber:" + lineNumber);
boolean startLeftBracket = pattern.startsWith("[");
boolean endRightBracket = pattern.endsWith(")");
/**
* 行号表达式是以左中括号开始,右括号结束
*/
if(!startLeftBracket || !endRightBracket){
return false;
}
int leftBracketIndex = pattern.indexOf("[");
int rightBracketIndex = pattern.indexOf(")&#