2014-10-28 137 views
0

我是Spring批处理的新手。只是想要一些建议,以便我可以在阅读春季批次时连接。使用Spring批处理执行多个处理类

我的场景如下: 我写了4个java类,它们会读取和修改oracle中的数据。例如:Class1和Class2将修改表1,Class3和Class4将修改表2

如何使用弹簧批处理来并行执行那些类?

回答

0

不知道每个班级都做了什么,我可以提供的建议有多好。话虽这么说,如果你想要做的是使用Spring Batch的并行执行的每个类,Spring Batch的提供了一些工具来帮助这样的:

  1. 斯普利特 - 春A批拆分为师流程使得步骤可以并行执行。在你的情况下,我希望两个或四个流并行执行(取决于你是否需要依次执行Class1 - > Class 2,但是该顺序与Class 3 - > Class4并行执行,或者如果您可以运行所有四个班级并行)。
  2. MethodInvokingTaskletAdapter - Spring Batch提供的这个Tasklet实现允许您在事务范围内的指定bean上执行一个方法。这使您可以用Tasklet包装现有的类,以便Spring Batch可以轻松使用它们。

有了上述概念,你可以配置你的批处理作业看起来像下面这样:

<job id="job1"> 
    <split id="split1"> 
     <flow> 
      <step id="split1Step1" next="split1Step2"> 
       <tasklet ref="class1Tasklet"/> 
      </step> 
      <step id="split1Step2"> 
       <tasklet ref="class2Tasklet"/> 
      </step> 
     </flow> 
     <flow> 
      <step id="split2Step1" next="split2Step2"> 
       <tasklet ref="class3Tasklet"/> 
      </step> 
      <step id="split2Step2"> 
       <tasklet ref="class4Tasklet"/> 
      </step> 
     </flow> 
    </split> 
</job> 

<bean id="class1Tasklet" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter"> 
    <property name="targetObject"> 
     <bean class="Class1"/> 
    </property> 
    <property name="targetMethod" value="someMethod"/> 
</bean> 

<bean id="class2Tasklet" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter"> 
    <property name="targetObject"> 
     <bean class="Class2"/> 
    </property> 
    <property name="targetMethod" value="someMethod"/> 
</bean> 

<bean id="class3Tasklet" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter"> 
    <property name="targetObject"> 
     <bean class="Class3"/> 
    </property> 
    <property name="targetMethod" value="someMethod"/> 
</bean> 

<bean id="class4Tasklet" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter"> 
    <property name="targetObject"> 
     <bean class="Class4"/> 
    </property> 
    <property name="targetMethod" value="someMethod"/> 
</bean> 

您可以将文档在这里阅读更多关于MethodInvokingTaskletAdapterhttp://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/step/tasklet/MethodInvokingTaskletAdapter.html

+0

让我们说你想要使用一个类而不是多个类。例如:类'Car'的方法是'start()'和'stop()'。步骤1是'start()',步骤2是'stop()'。使用上面的方法,假设您需要在启动和停止之间传递一些数据。这将如何完成以确保可重新启动是可能的? – 2016-11-09 19:34:10