没有上限的春季批次FixedLengthTokenizer范围不起作用

时间:2018-09-28 04:29:52

标签: spring spring-boot spring-batch

根据Range类的Java文档

  

范围最多可以无限制* *。可以通过指定   通过{@link Range#UPPER_BORDER_NOT_DEFINED}}作为最大值*或   使用构造函数{@link #Range(int)}

我有一个像

  

SomeText sometext等

更新:InputFile 基本上我有这样的多行数据集。 Itemid 是记录器的开始标识符。经过大量的努力,我正在使用SingleItemPeekableItemReaderPatternMatchingCompositeLineTokenizer,它可以正常工作并且能够读取所需pojo中的数据。该解决方案基于

https://docs.spring.io/spring-batch/4.0.x/reference/html/common-patterns.html#multiLineRecords

但作为

Itemid1-ID1
SomeRandomText1SomeRandomText1SomeRandomText1
SomeRandomText1
SomeRandomText1SomeRandomText1SomeRandomText1

Itemid2-ID2
SomeRandomText1SomeRandomText1
SomeRandomText1
SomeRandomText1
SomeRandomText1SomeRandomText1

数据项类似于

class Pojo 
{
 String id
String data // this data is concatenated string of of all remaining lines. until 
           //new data iteam 

}

如果我想配置FixedLengthTokenizer以便在n个单个字段中阅读

public FixedLengthTokenizer head()
    {
        FixedLengthTokenizer token = new FixedLengthTokenizer();
        token.setNames("id");
        token.setColumns(new Range(1));         
        return token;
    }

我的期望是,如果我没有在Range构造函数中提供最大限制,那么它将读取整行。但是我得到行长于最大范围1异常

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

在您的情况下,您需要指定两个范围:一个用于ID,另一个用于实际数据。这是一个示例:

@Test
public void testFixedLengthTokenizerUnboundedRange() {
    FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
    tokenizer.setNames("id", "data");
    tokenizer.setColumns(new Range(1, 5), new Range(6));
    FieldSet tokens = tokenizer.tokenize("12345\nSomeRandomText1\nSomeRandomText2");
    assertEquals("12345", tokens.readString("id"));
    assertEquals("SomeRandomText1\nSomeRandomText2", tokens.readString("data"));
}

此测试通过。因此,无限制范围正在按预期工作。

希望该示例有所帮助。