插入&从单个Spring Batch ItemReader更新

时间:2017-05-08 00:49:56

标签: spring-batch

我的流程将数据转换为 SCD2模式。因此,源数据中的任何更新最终都会更新active_ind& dimension表中的ItemReader并插入新记录。

我在{{1}}实现中配置了SQL,用于标识源数据中已更改的记录。

我需要有关如何将数据路由到2个编写器的帮助/建议,每个编写器1个用于更新&插入

1 个答案:

答案 0 :(得分:1)

Spring在这种用例中有一个通用模式,而不一定是使用Classifier Interface的Spring Batch。

您可以使用此界面的BackToBackPatternClassifier implementation

此外,您需要使用提供的ClassifierCompositeItemWriter Spring Batch。

以下是步骤摘要:

  1. 传递给writer的POJO / Java Bean应该有某种String字段,可以识别该POJO的目标ItemWriter

  2. 然后你写一个Classifier,为每个POJO返回那个String类型:

    public class UpdateOrInsertClassifier {
    
        @Classifier
        public String classify(WrittenMasterBean writtenBean){
            return writtenBean.getType();
        }
    }
    

    @Bean
    public UpdateOrInsertClassifier router() {
        return new UpdateOrInsertClassifier();
    }
    
  3. 我认为WrittenMasterBean是您发送给任一作者的POJO,并且它有private String type;字段此Classifier是您的路由器。

    1. 然后您实施BackToBackPatternClassifier之类的 -
    2. @Bean
      public Classifier classifier() {
          BackToBackPatternClassifier classifier = new BackToBackPatternClassifier();
          classifier.setRouterDelegate(router());
      
          Map<String,ItemWriter<WrittenMasterBean>> writerMap = new HashMap();
          writerMap.put("Writer1", writer1());
          writerMap.put("Writer2", writer2());
      
          classifier.setMatcherMap(writerMap);
          return classifier;
      }
      

      即。我假设密钥Writer1Writer2将标识您的特定bean的编写者。

      writer1()writer2()返回实际的ItemWriter bean。

      BackToBackPatternClassifier需要两个字段 - 一个路由器分类器和另一个匹配器映射。

      限制是键是此分类器中的字符串。您不能使用任何其他类型的密钥。

      1. BackToBackPatternClassifier传递给ClassifierCompositeItemWriter - 您需要使用提供的Spring Batch ClassifierCompositeItemWriter
      2.  @Bean
         public ItemWriter<WrittenMasterBean> classifierWriter(){
             ClassifierCompositeItemWriter<WrittenMasterBean> writer = new ClassifierCompositeItemWriter();
             writer.setClassifier(classifier());
             return writer;
         }
        

        您可以将此classifierWriter()配置到Step

        然后你很高兴。