首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季批处理问题w/ CompositeItemWriter和ClassifierCompositeItemWriter

春季批处理问题w/ CompositeItemWriter和ClassifierCompositeItemWriter
EN

Stack Overflow用户
提问于 2016-02-20 00:17:03
回答 1查看 2.6K关注 0票数 0

我使用spring批处理从数据库读取数据(使用分区),并根据输入键(1、2、3、4)将数据写入一组文件。

我创建了一个CompositeItemWriter,它是由两个ClassifierCompositeItemWriter(s)组成的。尽管我已将各个作者注册为流,但我仍然得到以下例外:

代码语言:javascript
复制
org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be written to

我甚至尝试将ItemWriter1和ItemWriter2注册为流,但是,这给了我一个不同的错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy13 implementing org.springframework.batch.item.ItemWriter,java.io.Serializable,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.batch.item.ItemStream] for property 'streams[0]': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:264)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:128)
    at org.springframework.beans.TypeConverterDelegate.convertToTypedArray(TypeConverterDelegate.java:463)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:195)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
    ... 74 more

我甚至在作者中实现了ItemStream,但是,它还不起作用。

代码语言:javascript
复制
public class WriterA1 implements ItemWriter<List<Object>>, ItemStream {
...
}

以下是xml配置:

代码语言:javascript
复制
...   
代码语言:javascript
复制
<job id="abcJob" xmlns="http://www.springframework.org/schema/batch"
    restartable="true"> 

    <step id="masterStep">
        <partition step="slaveStep" partitioner="abcPartitioner">
            <handler grid-size="${grid-size}" task-executor="abcTaskExecutor" />
        </partition>            
    </step> 

</job>

<step id="slaveStep" xmlns="http://www.springframework.org/schema/batch">
        <tasklet transaction-manager="transactionManager">
            <chunk reader="abcReader" writer="abcWriter"
                processor="abcProcessor" commit-interval="${a}" skip-limit="${b}" retry-limit="${c}" >

                <streams>
                    <!-- 
                    <stream ref="ItemWriter1"/> 
                    <stream ref="ItemWriter2"/>
                     -->                        
                    <stream ref="WriterA1"/>
                    <stream ref="WriterB2"/>
                    <stream ref="WriterC3"/>
                    <stream ref="WriterD4"/>                                            
                    <stream ref="WriterA5"/>
                    <stream ref="WriterB6"/>
                    <stream ref="WriterC7"/>
                    <stream ref="WriterD8"/> 

                </streams>                

            </chunk>
            <listeners>
                ...                                     
            </listeners>                                                
        </tasklet>              
    </step> 


<bean id="abcWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step">
    <property name="delegates">
        <list>              
            <ref bean="ItemWriter1" />
            <ref bean="ItemWriter2" /> 
        </list>
    </property>
</bean>  

<bean id="ItemWriter1" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step">
    <property name="classifier">
        <bean
            class="org.springframework.classify.BackToBackPatternClassifier">
            <property name="routerDelegate">
                <bean class="xxx.xxx.xxx.xxx.Classifier1" scope="step"/>
            </property>
            <property name="matcherMap">
                <map>
                     <entry key="1" value-ref="WriterA1" />
                     <entry key="2" value-ref="WriterB2" />
                     <entry key="3" value-ref="WriterC3" />
                     <entry key="4" value-ref="WriterD4" />
                </map>
            </property>
        </bean>     
    </property>
</bean>

<bean id="ItemWriter2" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step">
    <property name="classifier">
        <bean
            class="org.springframework.classify.BackToBackPatternClassifier">
            <property name="routerDelegate">
                <bean class="xxx.xxx.xxx.xxx.Classifier2" scope="step"/>
            </property>
            <property name="matcherMap">
                <map>
                     <entry key="1" value-ref="WriterA5" />
                     <entry key="2" value-ref="WriterB6" />
                     <entry key="3" value-ref="WriterC7" />
                     <entry key="4" value-ref="WriterD8" />
                </map>
            </property>
        </bean>     
    </property>
</bean>

 <bean id="WriterA1" class="xxx.xxx.xxx.xxx.WriterA1" scope="step">

 </bean>
 <bean id="WriterB2" class="xxx.xxx.xxx.xxx.WriterB2" scope="step">

 </bean>
<bean id="WriterC3" class="xxx.xxx.xxx.xxx.WriterC3" scope="step">

</bean>
<bean id="WriterD4" class="xxx.xxx.xxx.xxx.WriterD4" scope="step">

</bean>
  <bean id="WriterA5" class="xxx.xxx.xxx.xxx.WriterA5" scope="step">

  </bean>
  <bean id="WriterB6" class="xxx.xxx.xxx.xxx.WriterB6" scope="step">

  </bean>
 <bean id="WriterC7" class="xxx.xxx.xxx.xxx.WriterC7" scope="step">

 </bean>
 <bean id="WriterD8" class="xxx.xxx.xxx.xxx.WriterD8" scope="step">

 </bean>

请给我建议。

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 02:03:37

有三种类型的作家。自上而下:

  • abcWriterCompositeItemWriter。它通过将ItemStream方法调用委派给委托(这里是ItemWriter1ItemWriter2)来实现ItemStream,前提是它们实现ItemStream。事实并非如此。但是,即使它们实现了ItemStream,您也不应该在步骤配置中将ItemWriter1ItemWriter2单独注册为流(下一个要点还有另一个独立的原因)。
  • ItemWriter1/ItemWriter2ClassifierCompositeItemWriter的。这个类不实现ItemStream,所以不能在步骤配置中将它们注册为流。
  • WriterA1BeanIOFlatFileItemWriter类型的,因此实现ItemStream。因为包装它们的ClassifierCompositeItemWriter不调用它们的ItemStream方法(与CompositeItemWriter不同),所以必须在步骤配置中将每个方法注册为流。

但这就是你所声称的。然而,您的作用域范围内的WriterXX bean正在通过不实现ItemStreamItemStreamWriter,而只实现ItemWriter的单例bean进行代理(使用接口代理模式)。确保您在<bean>元素do实现ItemStream中的类。您还可以尝试显式创建作用域代理bean (使用ScopedProxyFactoryBean并设置interfaces属性)。或者,当ScopedProxyFactoryBean::setBeanFactory包含字符串WriterXX (它将类似于stepScopedTarget.WriterD8)时,您可以尝试在targetBeanName中断中放置一个断点,并尝试理解为什么没有代理ItemStream接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35517446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档