【问题标题】:spring batch exception Cannot construct java.util.Map$Entryspring批处理异常无法构造java.util.Map$Entry
【发布时间】:2015-02-20 10:52:37
【问题描述】:

我们在从命令行执行 spring 批处理作业时遇到以下异常。 Spring Batch 版本 - 3.0.2.RELEASE 春季版 - 4.0.0.RELEASE xStream 版本 - 1.4.7 数据库 - mysql(我正在连接到新的数据库模式。) 在使用以下命令执行作业时,我遇到了异常...

    java %JAVA_OPTS% org.springframework.batch.core.launch.support.CommandLineJobRunner config/spring-config.xml partitionJdbcJob

    Exception
    ----------

    INFO: Loaded JDBC driver: com.mysql.jdbc.Driver
    Feb 20, 2015 3:22:28 PM org.springframework.batch.core.launch.support.SimpleJobLauncher afterPropertiesSet
    INFO: No TaskExecutor has been set, defaulting to synchronous executor.
    Feb 20, 2015 3:22:29 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run
    INFO: Job: [FlowJob: [name=partitionJdbcJob]] launched with the following parameters: [{}]
    Feb 20, 2015 3:22:29 PM org.springframework.batch.core.job.AbstractJob execute

    SEVERE: Encountered fatal error executing job
    org.springframework.batch.core.JobExecutionException: Flow execution ended unexpectedly
            at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:140)
            at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304)
            at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
            at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
            at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
            at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:362)
            at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:590)
    Caused by: org.springframework.batch.core.job.flow.FlowExecutionException: Ended flow=partitionJdbcJob at state=partitionJdbcJob.step with exception
            at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:174)
            at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144)
            at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134)
            ... 6 more
    Caused by: com.thoughtworks.xstream.converters.ConversionException: Cannot construct java.util.Map$Entry : java.util.Map$Entry : Cannot construct java.util.Map$
    Entry : java.util.Map$Entry

    ---- Debugging information ----
    message             : Cannot construct java.util.Map$Entry : java.util.Map$Entry
    cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
    cause-message       : Cannot construct java.util.Map$Entry : java.util.Map$Entry
    class               : java.util.Map$Entry
    required-type       : java.util.Map$Entry
    converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
    path                : /map/map/entry
    line number         : -1
    class[1]            : java.util.HashMap
    converter-type[1]   : com.thoughtworks.xstream.converters.collections.MapConverter
    version             : 1.4.7
    -------------------------------
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79)
            at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
            at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71)
            at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryIntoMap(MapConverter.java:106)
            at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:98)
            at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:92)
            at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:87)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
            at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
            at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
            at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185)
            at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1169)
            at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1040)
            at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031)
            at org.springframework.batch.core.repository.dao.XStreamExecutionContextStringSerializer.deserialize(XStreamExecutionContextStringSerializer.java:112)
            at org.springframework.batch.core.repository.dao.XStreamExecutionContextStringSerializer.deserialize(XStreamExecutionContextStringSerializer.java:45)
            at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:322)
            at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:309)
            at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
            at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
            at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:706)
            at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:642)
            at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:693)
            at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:725)
            at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:735)
            at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:790)
            at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.getExecutionContext(JdbcExecutionContextDao.java:127)
            at org.springframework.batch.core.repository.support.SimpleJobRepository.getLastStepExecution(SimpleJobRepository.java:238)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            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 $Proxy7.getLastStepExecution(Unknown Source)
            at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:115)
            at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
            at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67)
            at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:165)
            ... 8 more
    Caused by: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Cannot construct java.util.Map$Entry : java.util.Map$Entry
            at com.thoughtworks.xstream.converters.reflection.SunLimitedUnsafeReflectionProvider.newInstance(SunLimitedUnsafeReflectionProvider.java:80)
            at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:553)
            at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:256)
            at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
            ... 57 more
    Caused by: java.lang.InstantiationException: java.util.Map$Entry
            at sun.misc.Unsafe.allocateInstance(Native Method)
            at com.thoughtworks.xstream.converters.reflection.SunLimitedUnsafeReflectionProvider.newInstance(SunLimitedUnsafeReflectionProvider.java:76)
            ... 60 more
Spring Config
----------------
<?xml version="1.0" encoding="UTF-8"?>
<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:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
                            http://www.springframework.org/schema/task 
                            http://www.springframework.org/schema/task/spring-task-3.2.xsd">

    <context:annotation-config /> 

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/newspringbatch?useServerPrepStmts=false&amp;rewriteBatchedStatements=true" />
        <property name="username" value="uid" />
        <property name="password" value="pwd" />
    </bean>

    <bean id="transactionManager"
        class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="pooledDS" />
    </bean>

    <!-- DB Pooling -->
    <bean id="pool" class="org.apache.commons.pool.impl.GenericObjectPool">
        <property name="minEvictableIdleTimeMillis"><value>300000</value></property>
        <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
    </bean>

    <bean id="dsConnectionFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
        <constructor-arg><ref bean="dataSource"/></constructor-arg>
    </bean>

    <bean id="poolableConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory">
        <constructor-arg index="0"><ref bean="dsConnectionFactory"/></constructor-arg>
        <constructor-arg index="1"><ref bean="pool"/></constructor-arg>
        <constructor-arg index="2"><null/></constructor-arg>
        <constructor-arg index="3"><null/></constructor-arg>
        <constructor-arg index="4"><value>false</value></constructor-arg>
        <constructor-arg index="5"><value>true</value></constructor-arg>
    </bean>

    <bean id="pooledDS" class="org.apache.commons.dbcp.PoolingDataSource" depends-on="poolableConnectionFactory">
        <constructor-arg><ref bean="pool"/></constructor-arg>
    </bean>

    <!-- stored job-meta in database -->
    <bean id="batchDefaultSerializer" class="org.springframework.batch.core.repository.dao.DefaultExecutionContextSerializer" />


    <bean id="jobRepository"
        class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
        <property name="dataSource" ref="pooledDS" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseType" value="mysql" />  

    </bean>

    <bean id="jobLauncher"
        class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
    </bean>

    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"></bean>

    <bean id="userUnmarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"></bean>

    <job id="partitionJdbcJob" restartable="true" xmlns="http://www.springframework.org/schema/batch">  
        <step id="step" >
            <partition step="createFiles" partitioner="partitioner">
                <handler grid-size="50" task-executor="taskExecutor" />
            </partition>
        </step>
        <listeners>
            <listener ref="jobDurationListener" />
        </listeners>
    </job>

    <step id="createFiles" xmlns="http://www.springframework.org/schema/batch">
        <tasklet>
            <chunk reader="pagingItemReader" processor="filesItemProcessor"
                writer="filesItemWriter" commit-interval="200" />
        </tasklet>
    </step>

    <!-- PagingItemReader will be used for big records only -->
    <bean id="pagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader"
        scope="step" autowire-candidate="false">
        <property name="dataSource" ref="pooledDS" />
        <property name="rowMapper" ref="reconRowMapper" />
        <!-- Query Provider -->
        <property name="queryProvider">
            <bean
                class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
                <property name="dataSource" ref="pooledDS" />
                <property name="fromClause" value="from sample" />
                <property name="selectClause" value="id,name" />
                <property name="sortKey" value="id" />

            </bean>
        </property>

        <!-- Inject via the ExecutionContext in partitioner -->
        <property name="parameterValues">
            <map>
                <entry key="minId" value="#{stepExecutionContext[minValue]}" />
                <entry key="maxId" value="#{stepExecutionContext[maxValue]}" />
            </map>
        </property>
    </bean>

    <bean id="filesItemProcessor" class="com.batch.job.ResultProcessor" />

    <bean id="filesItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"
        scope="step">
        <property name="resource" value="#{stepExecutionContext[outputFile]}" />
        <property name="shouldDeleteIfExists" value="true" />
        <property name="lineAggregator">
            <bean
                class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                <property name="delimiter" value="," />
                <property name="fieldExtractor">
                    <bean
                        class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                        <property name="names" value="id,name" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>


    Feb 20, 2015 3:22:29 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run
    INFO: Job: [FlowJob: [name=partitionJdbcJob]] completed with the following parameters: [{}] and the following status: [FAILED]
    Feb 20, 2015 3:22:29 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose
    INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext
    @d37d44: startup date [Fri Feb 20 15:22:27 IST 2015]; root of context hierarchy

【问题讨论】:

  • 您能否提供失败时您的ExecutionContext 中的内容?
  • 嗨,迈克尔,感谢您的回复。我很抱歉回复晚了。你能告诉我如何获取执行上下文吗?我正在使用一个分区器,我正在使用它向它注入 3 个参数。最后将其保存在地图中。当我通过 eclipse 执行它时,它可以正常工作,但是在批处理文件的帮助下通过命令提示符失败。在 Eclipse 中,我正在使用一个调度程序,它反过来触发一个作业,在命令提示符下,计划中没有调度程序。
  • 我可以通过使用 jettison-1.1.jar 而不是 jettison-1.3.1.jar 来解决它。 stackoverflow.com/questions/22306080/…
  • 感谢@sandipdesale!!

标签: java spring spring-batch


【解决方案1】:

运行 Spring Batch Job 时遇到同样的问题。在:

Set<JobExecution> runningJobExecutions = jobExplorer.findRunningJobExecutions(jobName);

通过使用 jettison 1.1 而不是 1.3.2 解决

【讨论】:

    【解决方案2】:

    虽然更改 Jettison jar 的版本也为我消除了错误,但这并没有解决根本问题。

    在我的情况下,最终原因是有两个具有相同名称的步骤。一旦我解决了这个问题,报告的异常就消失了。

    【讨论】:

      【解决方案3】:

      错误消息虽然令人困惑,但指向重复的作业/步骤。创建独特的工作/步骤帮助我解决了这个问题。无需其他更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多