【问题标题】:Spring Batch context holder nullSpring Batch 上下文持有者 null
【发布时间】:2016-06-04 15:40:07
【问题描述】:

很抱歉淹没了 Spring Batch SO 队列。

我从 Job Scope 模式继续前进,因为 appears to not work in XML configuration for 3.0.6。不过,我很可能只是感到困惑。

我尝试继续使用 step 范围,因为这似乎可行。这是我的 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 的创建失败。重要的是,这些是 REST Easy 客户端代理 bean。我是这样定义的:

<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"/>

但是我从我的顶级作业、它的子作业、它的子步骤以及那些步骤 bean 中级联错误,这些错误最终是由...引起的。

原因:org.springframework.beans.factory.BeanCreationException:创建名称为'someService'的bean时出错:范围'step'对当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException: No context holder available for step scope 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:341) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) ... 79 更多 原因:java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者 在 org.springframework.batch.core.scope.StepScope.getContext(StepScope.java:167) 在 org.springframework.batch.core.scope.StepScope.get(StepScope.java:99) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:327) ... 81 更多

我的工作需要初始化一些上下文吗?还是 spring-batch 与 rest easy 客户端正在利用的代理发生冲突?

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    首先,您不应该因为一些假定的错误而放弃工作范围,更不用说“转移到步骤范围”;两者都很重要并且服务于不同的目的。最明显的区别是,作业范围 bean 在作业期间存在,而步骤范围 bean 在单个步骤期间存在。

    如果确实存在错误,您可以像注册任何其他 Spring 上下文一样注册作业范围;实际上,更容易,因为 Spring Batch 的作用域实现还负责注册自身并自动创建单例代理 bean(如果您将 autoProxy 属性设置为 true,这是默认设置)。您只需要包含一个 org.springframework.batch.core.scope.JobScope 类型的 bean。

    至于你的错误,你没有提供足够的信息。可能有很多原因;我们所知道的是,Spring 尝试在没有任何作业步骤运行的情况下实例化一个步骤范围的 bean,至少就尝试获取 bean 的线程而言。因此,您的第一步是确定是什么触发了要实例化的 bean。这可能是 1) 未能创建单例代理(如果您有默认的自动代理设置,这应该不是问题;请注意,在这种情况下,您指定的 bean 名称是给单例代理的名称,实际上是步进范围的 bean它所委托的对象被重命名为stepScopedTarget.&lt;original bean name&gt;),或者,如果您有基本的工作,更有可能的是,2) 过早地调用单例代理上的方法,即,在步骤处于活动状态之前。如果您为同一个作业使用多个线程,您可能还必须使用StepSynchronizationManager::register/JobSynchronizationManager::close 将步骤范围传播给它。

    【讨论】:

    • 抱歉,我的意思不是将工作范围视为无效选项,但是,我无法在应用程序开始时使其中任何一个有效。提到代理可能在准备好之前被调用是一个非常有趣的点,我认为 resteasy 工厂正在实现一个 AfterProperties 设置接口。明天我会深入研究。
    • 代理上的调用在堆栈跟踪中相对容易辨别,前提是您不会在其他 100 帧中错过它。 afterPropertiesSet 应该不是问题。当作用域 bean 实际实例化时,当代理调用时,它将被调用。
    • 嗯,很有趣。所有这些都是在 wildfly 启动我们的应用程序时发生的。我将对日志进行更深入的挖掘并回复您。我现在离开我的机器,但我会尝试应用你的想法,看看我是否能取得进展。您是否通过 Xml 配置在作业范围 bean 方面取得了进展?我无法识别出在 3.0.6 上有效
    • @AdmiralAdama 我总是使用 Java 配置,但 this 工作正常,打印 TEST! Parameter is BAR
    • 谢谢@Artefacto。我想我在这里遇到了一些事情。 1) 如果我使用父 bean 来定义公共类/范围项,我会得到一个“没有可用于作业范围的上下文持有者”。 2) 现在我只注释了 1 个 bean,在它的确切声明中,我正面临这个 Target type could not be determined at the time of proxy creation. 错误消息。但这似乎在网上得到了很好的讨论。我认为这与 Batch factory 与 resteasy 因素冲突有关。
    猜你喜欢
    • 2021-11-13
    • 2020-11-29
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多