数据如何从Reader传递到Processor和Writer

时间:2018-01-04 09:24:28

标签: spring-batch processor writer reader

我是春季批次新手。我想了解数据如何从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会将这些数据存储在某个地方,然后传递到下一个阶段吗?怎么回事?

欢迎任何指示理解这一点或一些良好的读取链接。

提前致谢!

2 个答案:

答案 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变量在这两个协作者之间传递的。

希望这有帮助!