很抱歉淹没了spring批处理SO队列。
我离开了作业范围模式,因为这在3.0.6的XML配置中似乎不起作用。但我很可能会被搞糊涂。
我试着转到步进范围,因为这似乎是有效的。这是bean的app-context.xml配置头。这将启用scope=“step”
选项。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<bean id="rootServiceBean" scope="step"
class="com.myorg.ServiceProxyFactoryBean"
p:baseUri="${rest.base.uri}"
p:ticket="#{jobExecutionContext['jobSecrets']}" abstract="true"/>
<bean id="someServiceObject"
parent="rootServiceBean"
p:serviceInterface="com.myOrg.someServiceRest"/>
是否需要在作业中初始化一些上下文?还是spring-batch与rest easy客户端正在利用的代理冲突?
首先,您不应该因为某个假定的bug而放弃作业范围,更不应该“移动到step范围”;两者都很重要,而且服务于不同的目的。最明显的区别是,作业范围的bean在作业的持续时间内存在,步骤范围的bean在单个步骤的持续时间内存在。
如果确实存在一个bug,您可以以注册任何其他Spring上下文的方式注册作业范围;实际上,这更容易,因为Spring Batch的作用域实现还负责注册自身和自动创建单个代理bean(如果将autoproxy
属性设置为true
,这是默认值)。您所需要的只是包含一个org.springframework.batch.core.scope.jobscope
类型的bean。
至于你的错误,你没有提供足够的信息。原因可能有很多;我们只知道Spring试图在没有任何作业步骤运行的情况下实例化一个step范围的bean,至少就试图获取该bean的线程而言是这样。因此,您的第一步是确定是什么触发了要实例化的bean。这可能是1)创建一个单一代理失败(应该不是一个问题,如果您有默认的自动代理设置;请注意,在这种情况下,您指定的bean名称是给单个代理的名称,它所委托的实际步骤范围的bean被重命名为stepscopedtarget。
)或者,如果您有基本知识,更可能的是,2)过早地调用单个代理上的方法,即在有一个步骤活动之前。如果您为同一作业使用多个线程,您可能还必须使用stepsynchronizationManager::register
/jobsynchronizationManager::close
将步骤范围传播给它。
我有一个作业,它有一个并行执行的块步骤(8个分区): 阅读器:jdbcCursorItemReader 处理器:使用jdbcTemplate调用数据库(每个分区1个线程) Writer:写入文件 我使用一个JdbcCursorItemReader从共享的Postgres数据库(V9.2)读取数百万数据。(其他用户同时使用数据库) 谢谢你的帮助
我使用的是Spring批处理4.3.2。.我正在写测试,发现了一些奇怪的东西,签出下面的代码。 对于相同的jobexecutions,我会得到不同的“getStepExecutions()”结果,这取决于我获取它们的方式。你知道为什么会这样吗?还是我做错了什么? 干杯T
我有嵌套作业,主作业调用许多子作业,它们再次调用其他子作业。我正在使用spring批处理远程分区来分区步骤执行。 如果我使用spring batch admin停止主作业,它不会停止作业。所有作业都在继续运行。 它应该停止所有内部作业,并且在重新启动时,应该从停止内部作业的同一个地方启动内部作业。 那是因为嵌套作业吗?是否有嵌套级别的限制?还是因为远程分区?
在Spring Boot上下文的初始化过程中,有什么方法可以处理异常吗? 我的案例是在作业执行过程中处理错误,并根据发生的异常做一些工作。 例如,我有一个由读者和作家组成的工作。读取器和写入器使用以下属性初始化:rootFolder、inFolder、outfolder。这个简单的作业从/rootfolder/infolder/test.txt读取文件,并将数据写入rootfolder/outfo
我试图在Spring批处理作业中使用多线程步骤,但我得到一个“范围‘作业’对于当前线程不活动……”。我在Spring中尝试了几种方法,但目前我正在使用我认为是OOTB Spring构造的方法,但仍然失败。 错误是: 基本作业结构简化:作业SoftLayerUpload作业步骤:softlayerUploadFileStep(不能多线程)从Excel文件读取写入SoftLayerDataItemQu
我有一个假问题。为了解释我的用例,我有不同类型的DAO;比如说啤酒。。。等等,我想用一个通用的ItemWriter来处理所有的问题。我创建了一个,在这里我定义了; 作家班是这样的; 到目前为止一切都还好。事情变得复杂的地方是,我为每个存储库定义了单独的配置类,其中定义了存储库特定的项。例如,为用户插入数据库的步骤。 当我用IJ编写这段代码时,我抱怨