我正在使用Grails Spring Batch插件在Grails中使用Spring Batch。
如果我有一些固定长度的记录引用我的输入文件中的实体,其中该记录的一部分指示记录是否是新项目,应更新的现有项目或应删除的现有项目,什么是集成到Spring Batch模式的最佳模式?
因此,如果我的可能记录如下:
// create new record of type AA, data is 12345
AAN12345
// update record of type AA, data is 12345 (assume that the data is the key and I can find the existing AA item using this key)
AAU12345
// delete record of type AA using 12345 as the key
AAD12345
我很满意LineMapper,它从FlatFileItemReader获取一行并创建一个新项目并将其传递给编写者进行保存。
LineMapper可能如下所示:
class AaLineMapper implements LineMapper<AaItem> {
@Override
AaItem mapLine(String line, int lineNumber) throws Exception {
switch (line[0..1]) {
case 'N':
AaItem item = new AaItem()
// set fields here based on line
return item
break
case 'U':
// possibly this?
AaItem item = AaItem.findByKey(someValueWithinLine)
// set fields here based on line
return item
break
case 'D':
// not sure on this one, deleting and returning null doesn't seem to work
// I thought the writer should delete the object?
break
}
}
}
但是,为了更新,我是否假设最好的方法是在LineMapper中使用Item.findByKey(12345)
,然后修改项目并在作者中调用save()
?
如何实施删除?如果我从我的LineMapper返回一个null,那么应用程序似乎停止了。我以为作者应该删除对象,而不是这个?或者我只使用findByKey(12345)
,然后传递给写入删除标志?
对基本问题表示歉意,这是使用框架的第1天。我有兴趣了解最佳实践。
答案 0 :(得分:1)
你很亲密,但并不完全。你真正需要你的行映射器生成的是一个类的实例,它不仅包含要实现的域类的实例,还包含一个属性来指示需要采取的操作(可能是由项目处理器或分类项目)作家,取决于你的要求)。
这样的事情可能有用:
class MyActionContainerClass {
Object target
String actionType // U, D, N
}