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

应用程序服务器上的Spring批处理:在afterJob侦听器上找不到

郎建章
2023-03-14

我对Spring批处理和Spring一般都是新手。我正在开发一个将在WebSphere Application Server上运行的批处理作业。到目前为止,我只是用一些假的台阶搭建了一个骷髅。我还有一个监听器,用于在作业结束时更新一些Oracle DB表。以下是我的AppContext的一部分:

<batch:job id="spedizioneJob" restartable="true" parent="bankitJob">
        <batch:step id="verifyInputStep" next="technicalPropertiesEnforcementStep">
            <batch:tasklet ref="verifyInput" />
        </batch:step>
        <batch:step id="technicalPropertiesEnforcementStep" next="protocolAndProbatoryStep">
            <batch:tasklet ref="technicalPropertiesEnforcement" />
        </batch:step>
        <batch:step id="protocolAndProbatoryStep" next="exdiSendingStep">
            <batch:tasklet ref="protocolAndProbatory" />
        </batch:step>
        <batch:step id="exdiSendingStep">
            <batch:tasklet ref="exdiSending" />
        </batch:step>
        <batch:listeners merge="true">
            <batch:listener ref="spedizioneJobListener" />
        </batch:listeners>
    </batch:job>

下面是afterJob代码段的开头:

public void afterJob(JobExecution jobExecution) {

    // get params
    String iref = jobExecution.getJobParameters().getString("APPL_REQ_ID");
    SpedizioneInput spInput=(SpedizioneInput)jobExecution.getExecutionContext().get("input");

奇怪的是,在我的一些测试运行中(Rational Application Developer上的本地测试环境,但同样的情况发生在WAS的服务器上),通常不是第一次,没有找到作业执行,我得到了这个异常

[03/10/14 12.47.48:505 CEST] 0000003a AbstractJob   E org.springframework.batch.core.job.AbstractJob execute Encountered fatal error executing job
                                 org.springframework.batch.core.repository.dao.NoSuchObjectException: Invalid JobExecution, ID 224 not found.
    at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.updateJobExecution(JdbcJobExecutionDao.java:218)
    at org.springframework.batch.core.repository.support.SimpleJobRepository.update(SimpleJobRepository.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at $Proxy36.update(Unknown Source)
    at org.springframework.batch.core.job.AbstractJob.updateStatus(AbstractJob.java:416)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:299)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
    at java.lang.Thread.run(Thread.java:736)

我不知道这是不是和我处理工作的方式有关....我配置了这样一种发射器:

<bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
    </property>
</bean>
try {
            System.out.println("Before launching spedizione job");
            JobExecution jexec=jobLauncher.run(job, jpb.toJobParameters());
            System.out.println("After launching spedizione job "+jexec.getJobConfigurationName()+" status "+jexec.getStatus().toString());

共有1个答案

赵英资
2023-03-14

正如Michael所建议的,问题出在我所使用的事务管理器上。当我切换到WebSphereUowTransactionManager时,我解决了我的问题。http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/jta/websphereuowtransactionmanager.html

 类似资料:
  • 问题内容: 试图使用es6在没有多个处理程序的情况下创建动态状态,但我陷入了困境。我不知道下面的代码有什么问题 我检查了我的其他函数,handleAdvancePrice是罪魁祸首,但是出了什么问题? 问题答案: 罪魁祸首是后面的多余迹象。另外,也不需要使用单独的; y,因为您可以直接使用

  • 问题内容: 我的错误: 我常见的数据库连接类: 每笔交易我都会参考此类并进行提取和CRUD操作。我的代码有什么问题吗? 问题答案: 您打开了很多连接,这就是问题所在。我认为在您的代码中,您没有关闭打开的连接。 数据库反弹可能会暂时解决,但在您连续执行时会重新出现。另外,还应验证到数据库的并发连接数。如果达到最大DB进程参数,这是常见症状。 此线程的礼貌:https : //community.or

  • 我使用Spring批处理管理来管理和监视作业和执行。如何调用一个作业并从一个独立的java应用程序启动它,该应用程序具有到包含Spring Batch Admin WebApp的服务器的给定HTTP连接。 谢谢你的帮助

  • 我有一个关于Spring的ApplicationListener在父上下文和子上下文方面的性质的问题。假设您创建了一个父上下文,它创建了一个bean,该bean是一个单例,并注册为ApplicationListener。然后,使用父上下文创建子上下文。关闭子上下文时,Spring将发送ContextClosedEvent。该事件是否也会传播到父上下文,从而导致作为ApplicationListen

  • 我有一个自定义跳过管理步骤。我定义了一个跳过策略,其源代码如下: 我的Skip侦听器如下: 我的步骤定义如下: 我想跳过一个约束冲突异常。但是,不会调用侦听器或跳过策略。

  • 在终端上,我得到了这个错误:$./asadmin start-domain domain1 找不到默认的域目录。此系统属性没有值:com.sun.aas.domainsroot命令启动-域失败。 在Eclipse上,我得到了这个运行时异常:在Felix平台上启动GlassFish 玻璃鱼4 拜托,你知道怎么解决这个问题吗?