下面是我目前正在使用的作业文件。
<batch:job id="job1">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="reader" processor="processor" writer="ItemWriter" commit-interval="3">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
最佳答案
正如 Luca 的评论中所说,您可以使用需要 org.springframework.classify.Classifier
的 ClassifierCompositeItemWriter
。
后者的少数实现之一是 org.springframework.classify.BackToBackPatternClassifier
,它依次采用 routerDelegate
和 matcherMap
。
routerDelegate
是一个 bean,它将有一个用 @Classifier
注释的方法。此方法将获取一个 Object
并返回一个 String
。然后,此字符串将与您在 module-context
中声明的值相匹配,并相应地调用 ItemWriter
。
这是一个例子:
<bean class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<property name="classifier">
<bean class="org.springframework.classify.BackToBackPatternClassifier">
<property name="routerDelegate">
<bean class="xx.xx.xx.YourClassifier"></bean>
</property>
<property name="matcherMap">
<map>
<entry key="value1">
<bean class="xx.xx.xx.YourItemWriter1></bean>
</entry>
<entry key="value2">
<bean class="xx.xx.xx.YourItemWriter2></bean>
</entry>
</map>
</property>
</bean>
</property>
</bean>
下面是分类器的样子(这是一个通用分类器,使用 Reflect API 调用作为对象参数传递的方法):
public class GenericClassifier<T> {
private String methodName;
@Classifier
public String classify(T classifiable) {
Method method;
String value = "";
try {
// Get the method with Reflect
method = classifiable.getClass().getMethod(methodName);
// Call the method with Reflect
value= (String) method.invoke(classifiable);
} catch (Exception e) {
// Error management
}
return value;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
}
这个分类器是这样使用的,其中YourMethod
是待分类对象的类的公共(public)方法(不带括号):
<bean class="xx.xx.xx.GenericClassifier">
<property name="methodName" value="YourMethod"></property>
</bean>
Classifier
返回的 value
字符串然后与相应的 entry
的 key
相匹配matcherMap
.
关于spring-batch - 如何使用单个读取器配置 Spring 批处理作业并根据返回的对象调用多个写入器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330171/