根据操作类型调用特定的编写器?
Invoke particular writer based on operation type?
我正在处理一个批次,它读取每一行并插入数据库以及写入文件。我想在数据库和文件中写入下面的数据。因此需要使用 ClassifierCompositeItemWriter
调用特定的编写器。我有包含以下行的文件:
DATA,I,1,John,Shiazo,Sushi
DATA,U,8,Pablo,Carmen
DATA,D,9,Diego,Sergio
DATA,I,10,rucha,rekha
这里,I代表插入,U代表更新,D代表删除。我应该如何调用一个特定的写入器进行插入,另一个用于更新,另一个用于删除。这三个 writer 将根据操作(插入、更新和删除)以不同的方式工作,并且还有一个 writer 将始终在文件中写入数据。
下面是我的示例代码:
@Classifier
public List<String> classify(Object object) {
String type = "Success";
List<String> list = new ArrayList<String>();
if(person.getOperationType().contentEquals("I")){
String insert = "I";
list.add(type);
list.add(insert);
}else if(person.getOperationType().contentEquals("U")){
String update = "U";
list.add(type);
list.add(insert);
}else{
delete = "D";
list.add(type);
list.add(delete);
}
}
示例 xml 作者代码:
<bean id="classifierFileItemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step"> <property name="classifier"> <bean class="org.springframework.classify.BackToBackPatternClassifier"> <property name="routerDelegate">
<bean class="com.iz.batchprocessing.writer.SuccessFailClassifier" scope="step"/>
</property>
<property name="matcherMap">
<map>
<entry key="I" value-ref="jdbcInsertItemWriter" /> //insert writer, here I want access ArrayList
<entry key="U" value-ref="jdbcUpdateItemWriter" /> //update writer, here I want access ArrayList
<entry key="D" value-ref="jdbcDeleteItemWriter" /> //delete writer, here I want access ArrayList
<entry key="Success" value-ref="successMultiFileItemWriter" /> //common file writer
</map>
</property>
</bean>
</property> </bean>
请告诉我该怎么做?或者还有其他方法可以实现吗?
我没有研究过这种类型的作家,但通过查看 another SO Question 和 - Serkan Arıkuşu 的回答,我发现您需要 return 来自 [=11] 的值/键=] 并且 matcherMap
将使用它来映射适当的作者。
我看到你没有从你的 classifier returning 任何 key,你只是对那些字符串变量进行赋值,而不是 return正在处理任何事情。
通过查看该答案,我可以说您需要将该密钥嵌入到您正在编写的 Item
中,并且 return 该密钥用于您 Classifier
中的每个项目。
Mukesh Sabde 的回答有完整的代码示例。
而不是将字符串添加到 List 和 returning List ,您应该 return 连接 String 并且那些应该是匹配器映射中的键。
我查看了 BackToBackPatternClassifier
class 的代码,它有两个私有字段 - private Classifier<C, String> router;
和
private Classifier<String, T> matcher;
因此您不能将 List
指定为 matcherMap
属性 的键。它必须是一个字符串,你错了。
对于您的情况,C
是 Spring 要写入的批次 Item
,T
是 ItemWriter
。
希望对您有所帮助!!
我正在处理一个批次,它读取每一行并插入数据库以及写入文件。我想在数据库和文件中写入下面的数据。因此需要使用 ClassifierCompositeItemWriter
调用特定的编写器。我有包含以下行的文件:
DATA,I,1,John,Shiazo,Sushi
DATA,U,8,Pablo,Carmen
DATA,D,9,Diego,Sergio
DATA,I,10,rucha,rekha
这里,I代表插入,U代表更新,D代表删除。我应该如何调用一个特定的写入器进行插入,另一个用于更新,另一个用于删除。这三个 writer 将根据操作(插入、更新和删除)以不同的方式工作,并且还有一个 writer 将始终在文件中写入数据。
下面是我的示例代码:
@Classifier
public List<String> classify(Object object) {
String type = "Success";
List<String> list = new ArrayList<String>();
if(person.getOperationType().contentEquals("I")){
String insert = "I";
list.add(type);
list.add(insert);
}else if(person.getOperationType().contentEquals("U")){
String update = "U";
list.add(type);
list.add(insert);
}else{
delete = "D";
list.add(type);
list.add(delete);
}
}
示例 xml 作者代码:
<bean id="classifierFileItemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step"> <property name="classifier"> <bean class="org.springframework.classify.BackToBackPatternClassifier"> <property name="routerDelegate">
<bean class="com.iz.batchprocessing.writer.SuccessFailClassifier" scope="step"/>
</property>
<property name="matcherMap">
<map>
<entry key="I" value-ref="jdbcInsertItemWriter" /> //insert writer, here I want access ArrayList
<entry key="U" value-ref="jdbcUpdateItemWriter" /> //update writer, here I want access ArrayList
<entry key="D" value-ref="jdbcDeleteItemWriter" /> //delete writer, here I want access ArrayList
<entry key="Success" value-ref="successMultiFileItemWriter" /> //common file writer
</map>
</property>
</bean>
</property> </bean>
请告诉我该怎么做?或者还有其他方法可以实现吗?
我没有研究过这种类型的作家,但通过查看 another SO Question 和 - Serkan Arıkuşu 的回答,我发现您需要 return 来自 [=11] 的值/键=] 并且 matcherMap
将使用它来映射适当的作者。
我看到你没有从你的 classifier returning 任何 key,你只是对那些字符串变量进行赋值,而不是 return正在处理任何事情。
通过查看该答案,我可以说您需要将该密钥嵌入到您正在编写的 Item
中,并且 return 该密钥用于您 Classifier
中的每个项目。
Mukesh Sabde 的回答有完整的代码示例。
而不是将字符串添加到 List 和 returning List ,您应该 return 连接 String 并且那些应该是匹配器映射中的键。
我查看了 BackToBackPatternClassifier
class 的代码,它有两个私有字段 - private Classifier<C, String> router;
和
private Classifier<String, T> matcher;
因此您不能将 List
指定为 matcherMap
属性 的键。它必须是一个字符串,你错了。
对于您的情况,C
是 Spring 要写入的批次 Item
,T
是 ItemWriter
。
希望对您有所帮助!!