当前位置: 首页 > 知识库问答 >
问题:

Spring批处理上下文保持符为空

林礼骞
2023-03-14

很抱歉淹没了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客户端正在利用的代理冲突?

共有1个答案

黄景胜
2023-03-14

首先,您不应该因为某个假定的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编写这段代码时,我抱怨