Spring Batch 中 @JobScope 的预期目的是什么?在步骤之间共享内存数据的预期方式是什么?
What is the intended purpose of @JobScope in Spring Batch? What's the intended way to share in-memory data between steps?
我今天用它来缓存步骤之间的对象,这样我就不必在一个步骤中构建整个作业。起初,由于我的步骤没有任何范围的注释(尽管很难理解它们不是隐含的 @JobScope
),我 运行 陷入了一些棘手的单元测试问题,声称:
Scope 'job' 对当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:没有可用于作业范围的上下文持有者
我读到(在自废弃的 Gitter 线程(非常有用)上)这可能不是 @JobScope 的正确用例。事实上,我现在担心工作范围以某种方式针对每个线程。
这让我想到 @JobScope
的目的是什么,如果我真的在滥用它?如果我滥用它,在同一作业中的步骤之间共享数据而不写入数据库 table/temporary 文件只是为了在下一步开始时转身读取它的正确方法是什么?
作为旁注:(并且 Spring Batch 在这方面与其他框架没有什么不同)这些问题源于可用的示例过于简单,与现实世界的使用没有太大关系。
JobScope
在 90% 以上的情况下是代码味道。这就是为什么我们多年来一直避免添加它。它实际上只是添加到 Spring Batch 中,因为该功能是 JSR-352 实现所必需的。
在步骤之间共享数据的 "right" 方法是通过某种适当的数据存储(某种数据库、NoSQL 存储、文件等)。如果您的工作出现故障,您希望该数据在重新启动时可用,这将无法通过 JobScope
定义的缓存在内存中共享这些值。如果您有大量数据,您希望将其保存在某处以节省内存使用。此外,正如您所指出的,JobScope
(就像 StepScope
)并非对所有线程都可用(因为我们不管理作业中的所有线程,所以没有实用的方法来制作发生了)所以它限制了它的用处。
最后,我还没有找到一个用例,我说过 JobScope
是处理给定用例的正确方法,包括这个。
我今天用它来缓存步骤之间的对象,这样我就不必在一个步骤中构建整个作业。起初,由于我的步骤没有任何范围的注释(尽管很难理解它们不是隐含的 @JobScope
),我 运行 陷入了一些棘手的单元测试问题,声称:
Scope 'job' 对当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:没有可用于作业范围的上下文持有者
我读到(在自废弃的 Gitter 线程(非常有用)上)这可能不是 @JobScope 的正确用例。事实上,我现在担心工作范围以某种方式针对每个线程。
这让我想到 @JobScope
的目的是什么,如果我真的在滥用它?如果我滥用它,在同一作业中的步骤之间共享数据而不写入数据库 table/temporary 文件只是为了在下一步开始时转身读取它的正确方法是什么?
作为旁注:(并且 Spring Batch 在这方面与其他框架没有什么不同)这些问题源于可用的示例过于简单,与现实世界的使用没有太大关系。
JobScope
在 90% 以上的情况下是代码味道。这就是为什么我们多年来一直避免添加它。它实际上只是添加到 Spring Batch 中,因为该功能是 JSR-352 实现所必需的。
在步骤之间共享数据的 "right" 方法是通过某种适当的数据存储(某种数据库、NoSQL 存储、文件等)。如果您的工作出现故障,您希望该数据在重新启动时可用,这将无法通过 JobScope
定义的缓存在内存中共享这些值。如果您有大量数据,您希望将其保存在某处以节省内存使用。此外,正如您所指出的,JobScope
(就像 StepScope
)并非对所有线程都可用(因为我们不管理作业中的所有线程,所以没有实用的方法来制作发生了)所以它限制了它的用处。
最后,我还没有找到一个用例,我说过 JobScope
是处理给定用例的正确方法,包括这个。