我正在使用Spring进行一个项目。在这个项目中,我使用Spring批处理后期绑定,在这个绑定中,我使用JobParameters.注入了一个参数(一个字符串将用作SQL查询的条件)目前,我正在使用@StepScope进行后期绑定,而且一切都很好。
这里我要问的是什么时候使用@StepScope,什么时候使用@JobScope。我已经阅读了Spring批处理引用,并搜索了有关StepScope和JobScope的内容。我所得到的就是:
StepScope : Spring将使用spring容器为每个步骤的执行实例化该组件的新实例。
b. JobScope :每个执行作业只有一个实例。
我只是无法确定何时使用StepScope或JobScope。有人能解释得更深一点吗?
发布于 2018-07-27 02:46:56
每个作业由三个步骤组成,即读取步骤、过程步骤和写入步骤。如果您创建了一个具有步骤作用域的bean,那么您可以从这三个步骤中的每一个步骤引用它--但是在每个步骤中都会得到该bean的不同实例。我创建了一个带有作业范围的bean,然后您可以从这三个步骤中的每一个引用它--在这三个上下文中它都是相同的实例。
因此,如果需要在bean中存储一个步骤,而同一作业中的后续步骤将访问它,则希望该bean位于作业范围内。如果希望保证任何步骤在bean中存储和操作的数据都是该步骤的本地数据(对其他步骤隐藏),则希望该bean处于逐步范围内。
发布于 2019-05-29 12:46:33
步骤由读取、转换/进程和写入阶段组成,后者是每个块在处理阶段都会出现复杂的重试/回滚过程,而读取阶段通常是不回滚不重试。一个任务是由任意多个步骤组成的,每个步骤都是你喜欢的。因此,步骤作用域bean对于每个读/进程/写阶段和给定步骤的侦听器都是相同的实例。作业范围是作业中所有步骤的相同实例。
因此,如果您需要在一个作业的多个步骤中使用同一个侦听器进行某些处理(您有一个步骤将数据转换为中间格式并进行验证,然后一个步骤将所有数据处理到您的数据库,并且您希望同一个侦听器在某个地方执行一些异步审核过程),那么您将作业范围这个侦听器并根据作业中的两个步骤注册它。这样,每一步都会看到代理后面的对象的相同实例,在同一个实例上的相同方法将被调用用于诸如"on read error“或"after way”或"after step“(取决于您是使用基于注释的侦听器还是基于接口的侦听器,以及您正在侦听的内容)。
例如,您的读取器在任何时候都只能用一个步骤来使用,因此将像您的读取器这样的内容作为步骤作用域通常是正确的,在这里创建阅读器并指向特定的资源。一个更好的示例是侦听器,您可能需要在步骤完成后清理目录或执行某些操作,但由于此过程随每个步骤更改(目录位置),尽管您希望侦听器具有相同的实际对象类型,而且您甚至希望它执行相同的操作,您甚至希望它使用一个新目录和一个新的UUID前缀,或者每一步使用一些内容,您将为该bean提供一个定义,可能使用相同的作业参数,但该定义将新增加一个临时目录或UUID等,并将该bean定义设置为步骤范围,这样当您将其连接到两个不同的步骤时,它们就会在延迟代理后面得到两个不同的实际对象。
现在,作业侦听器可能应该是作业作用域,但这里提出了一个问题,如果您希望在所有步骤(和 all作业)上使用相同的实例,那么您可以使用“常规作用域”单例,然后使用它。
或
还应考虑:
当您创建一个单例,并且它有一个作业范围或步骤作用域bean,即使您的单例对象是“处处”使用的相同对象,当它引用任务或步骤范围内的对象(实际上是一个代理)时,它将相应地看到每个作业或步骤中的不同对象。因此,您可以有一个表示步骤的单例bean,该步骤可以引用步骤范围内的bean。这样,您使用Step构建Job的实例就应该是单独的,但它已经连接到它的bean方法/定义/构造函数中,它在执行时所依赖的步长范围bean是不同的实例。
https://stackoverflow.com/questions/51549891
复制相似问题