我是春季批次新手。我想了解数据如何从Reader传递到Processor以及从处理器传递到Writer?所以基本上在Reader中我们将使用@Override
public Detector.DetectionType onDetectionSuccess(DetectionFrame validFrame) {
FaceIDDataStruct dataStruct = mDetector.getFaceIDDataStruct();
if (dataStruct != null) {
face = dataStruct.images.get("image_best");
Intent intent = new Intent(LivenessActivity.this, UploadActivity.class);
//facefileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
//intent.putExtra("filePath", facefileUri.getPath());
intent.putExtra("image_best",face);
setResult(PAGE_INTO_LIVENESS, intent);
startActivity(intent);
}
if (face == null) {
face = validFrame.getCroppedFaceImageData();
}//do something with liveness face
return DetectionType.DONE;
}
方法返回某种数据,比如String ..这个返回类型将被用作处理器中read()
方法的输入参数。
所以我想要理解的是,一旦process()
方法返回一个String数据,直到它到达read()
方法,该传输是如何处理的? spring会将这些数据存储在某个地方,然后传递到下一个阶段吗?怎么回事?
欢迎任何指示理解这一点或一些良好的读取链接。
提前致谢!
答案 0 :(得分:0)
你似乎在考虑这个问题,因为它比现在更复杂。这与任何其他面向对象的方法调用没有什么不同。
当read()方法完成时,它返回一个(希望定义的泛型类型)对象,然后将其作为参数传递给process()方法,然后在完成时将该对象传递给write( ) 方法。这一切都在内存中有效发生(这就是为什么工作被清除),就像你将任何对象传递给方法一样。
Object someData = read();
process(someData);
write(someData);
答案 1 :(得分:0)
Spring Batch使用如下所述的面向块的处理:https://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#chunkOrientedProcessing
这个想法是一次读取/处理一个项目,直到创建一个(预定义大小的)块。这种设计选择避免了将整个数据源加载到内存中,这在处理大量数据时非常有效。另一方面,写入操作一大块项目(而不是单个项目)以优化写入(如jdbc批量插入或弹性搜索批量插入)。
如果您想了解更多关于幕后发生情况的详细信息,请邀请您查看基本上使用两个合作者的ChunkOrientedTasklet类的代码:
ChunkProvider
(将项目读取委派给ItemReader
)ChunkProcessor
(分别委托处理和写入ItemProcessor
/ ItemWriter
)以下是代码的简化版本:
Chunk inputs = chunkProvider.provide(contribution);
chunkProcessor.process(contribution, inputs);
contribution
对象用于将块贡献添加到步骤。所以回答你的问题:
“如何处理这种转移?春天会将这些数据存储在某个地方,然后传递到下一个阶段吗?”
项目实际上是通过inputs
类型的Chunk
变量在这两个协作者之间传递的。
希望这有帮助!