Spring批处理分区无法使用复合项处理器

Spring批处理分区无法使用复合项处理器,spring,composite,itemprocessor,Spring,Composite,Itemprocessor,我有一个Spring批处理分区工作。我正在使用CompositeProcessor,从数据库中读取数据,并将这些项目保存到CopyOnWriteArrayList中。因为环境是并发的,但我的CopyOnWriteArrayList被用于其他线程和混合信息,所以我不知道为什么我做的不好,我做的不好,以及输出将它们写入每个线程的文件中 public class CustomerItemProcessor implements ItemProcessor<beangenerico,CopyOnW

我有一个Spring批处理分区工作。我正在使用CompositeProcessor,从数据库中读取数据,并将这些项目保存到CopyOnWriteArrayList中。因为环境是并发的,但我的CopyOnWriteArrayList被用于其他线程和混合信息,所以我不知道为什么我做的不好,我做的不好,以及输出将它们写入每个线程的文件中

public class CustomerItemProcessor implements ItemProcessor<beangenerico,CopyOnWriteArrayList<beanCustomer>> {

 private CustomerDAO customerDAO;
 private CopyOnWriteArrayList<beanCustomer> listbean;

 public CopyOnWriteArrayList<beanCustomer> process(beangenerico rangos) throws Exception {

      listbean = customerDAO.getAccAgentes(rangos);

      if(listbean != null) {
          //customer.setId(currentCustomer.getId());
         return listbean;
      }else{
         return null;
         }
    }
我的批处理im XML的配置:

<batch:job id="partitionJob" xmlns="http://www.springframework.org/schema/batch">
      <batch:step id="masterStep">
         <batch:partition step="slave" partitioner="rangePartitioner">
                 <batch:handler grid-size="10" task-executor="taskExecutor"/>
         </batch:partition>
      </batch:step>
</batch:job>

<!-- each thread will run this job, with different stepExecutionContext values. -->
<batch:step id="slave" xmlns="http://www.springframework.org/schema/batch">
              <batch:tasklet task-executor="taskExecutor" throttle-limit="1">
                 <batch:chunk reader="beaniniendreader" writer="tempRecordsWriter"  processor="completeItemProcessor" commit-interval="1" />
              </batch:tasklet>
        </batch:step>

        <bean id="taskExecutor"  class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

        <bean id="rangePartitioner" class="my.package.springbatch.RangePartitioner" />  
    <bean id="beaniniendreader" class="my.package.springbatch.FormiikReader" scope="step"></bean>

    <bean id="beanprocessor" class="my.package.springbatch.FormiikProcessor" scope="step">
       <property name="accountExecutiveDao" ref="accountExecutiveDao"/>
    </bean>

    <bean id="beanprocessor2" class="my.package.springbatch.CustomerItemProcessor" scope="step">
       <property name="customerDAO" ref="customerAccDao"/>
    </bean>

    <bean id="completeItemProcessor"  class="org.springframework.batch.item.support.CompositeItemProcessor">
       <property name="delegates">
           <list>
                <ref bean="beanprocessor2"/>
                <ref bean="accItemprocessor"/>
                <ref bean="beanaccDataItem"/>
           </list>
      </property>
    </bean> 

    <bean id="tempRecordsWriter" class="my.package.springbatch.ListDelegateWriter" scope="step">
       <property name="delegate" ref="flatFileItemWriterPartition"/>
    </bean>

    <!-- csv file writer -->
    <bean id="flatFileItemWriterPartition" class="org.springframework.batch.item.file.FlatFileItemWriter"
     scope="step" >
      <property name="resource"
     value="file:csv/outputs/users.processed#{stepExecutionContext[fromId]}-#{stepExecutionContext[toId]}.csv" />
         <property name="appendAllowed" value="false" />
         <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="cuenta, name, purchasedPackage" />    
               </bean>
           </property>
        </bean>
    </property>
    </bean>

回到我的代码主题,建议我使用Threadlocal存储线程特定的数据,这样它就可以工作了。我又把代码放在这里了。谢谢你的回复

public class CustomerItemProcessor implements ItemProcessor<beangenerico,ThreadLocal<CopyOnWriteArrayList<beanCustomer>>> {
    private CustomerDAO customerDAO;
    private ThreadLocal<CopyOnWriteArrayList<beanCustomer>> listbean = new ThreadLocal<CopyOnWriteArrayList<beanCustomer>>();      

    public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> process(beangenerico rangos) throws Exception {

            listbean.set(new CopyOnWriteArrayList<beanCustomer>());
            listbean = customerDAO.getAccAgentes(rangos);

            if(listbean != null) {

                return listbean;
            } else {
                return null;
            }

    }

    public void setCustomerDAO(CustomerDAO customerDAO) {
            this.customerDAO = customerDAO;
    }

}

我回到我的代码主题,建议我使用Threadlocal存储线程特定的数据,这样它就可以工作了。我又把代码放在这里了。谢谢你的回复

public class CustomerItemProcessor implements ItemProcessor<beangenerico,ThreadLocal<CopyOnWriteArrayList<beanCustomer>>> {
    private CustomerDAO customerDAO;
    private ThreadLocal<CopyOnWriteArrayList<beanCustomer>> listbean = new ThreadLocal<CopyOnWriteArrayList<beanCustomer>>();      

    public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> process(beangenerico rangos) throws Exception {

            listbean.set(new CopyOnWriteArrayList<beanCustomer>());
            listbean = customerDAO.getAccAgentes(rangos);

            if(listbean != null) {

                return listbean;
            } else {
                return null;
            }

    }

    public void setCustomerDAO(CustomerDAO customerDAO) {
            this.customerDAO = customerDAO;
    }

}

你好,彼得。如果您能更深入地了解如何在StackOverflow上格式化源代码,那就太好了。我尽力了。对于我们来说,这也是很多代码。如果你减少代码,把自己限制在一个最小的例子里,你就更有可能吸引别人的注意力来回答你的问题。如果您能更深入地了解如何在StackOverflow上格式化源代码,那就太好了。我尽力了。对于我们来说,这也是很多代码。如果你减少代码,把自己限制在一个最小的例子中,你就更有可能吸引别人回答你的问题所需要的注意力。