2017-01-02 14 views
1

Я работаю с одной партией, которая читает каждую строку и вставляет в db, а также записывает в файл. Я хочу написать данные ниже в базе данных, а также в файле. Поэтому нужно позвонить конкретному писателю, используя ClassifierCompositeItemWriter. У меня есть файл, который имеет следующие строки:Вызывают конкретный писатель, основанный на типе операции?

DATA,I,1,John,Shiazo,Sushi

DATA,U,8,Pablo,Carmen

DATA,D,9,Diego,Sergio

DATA,I,10,rucha,rekha

Здесь я обозначает вставку, U означает обновление и D означает удаление. Как я могу назвать один конкретный сценарий для вставки, другой - для обновления, а еще один - для удаления. Этот три автора будут работать по-разному на основе операций (Insert, Update и Delete), и есть еще один сценарий, который всегда будет работать для записи данных в файл.

Ниже мой пример кода:

@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> 

Пожалуйста, скажите мне, как я могу это сделать? Или есть ли другой способ достичь этого?

+0

Где вы готовите этот список? в процессоре? Зачем вам три отдельных писателя, три разных метода в одном писателе не работают? –

+0

ваш вопрос, просто спросить, как использовать 'ClassifierCompositeItemWriter'? –

+0

Нет, мой вопрос заключается не в том, как использовать 'ClassifierCompositeItemWriter'. Я готовлю этот список в классификаторе писателя. Поскольку я использую xml-конфигурацию весенней партии, так как я много знаю о весенней партии, я не могу делать три разных метода в весенней партии. Если вы знаете, отправьте пример кода. Я хочу отправить несколько параметров из классификатора, таких как «Успех и я» или «Успех и D» или «Успех и U». На данный момент только я застрял. – rucha

ответ

0

Я не работал на этом типе писателя, но, глядя на another SO Question и ответ на - Серкан Arıkuşu, я вижу, что вам нужно возвращать значение/ключ от вашего Classifier и которые будут использоваться matcherMap для отображения соответствующих авторов ,

Я вижу, что вы не возвращаете ключ из вашего классификатора, вы просто назначаете эти переменные String, но ничего не возвращаете.

Посмотрев на этот ответ, я могу сказать, что вам нужно вставить этот ключ в свой Item, который записывается и возвращает этот ключ для каждого элемента из вашего Classifier.

Ответа на этот вопрос Mukesh Sabde с кодом целиком.

Вместо того, чтобы добавлять строки для списка и возвращаемого списка, вы должны возвращать конкатенированную строку, и они должны быть ключами в карте сопоставления.

Я посмотрел на код BackToBackPatternClassifier класса, он имеет два частных поля - private Classifier<C, String> router; &

private Classifier<String, T> matcher; 

Таким образом, вы не можете указать List в качестве ключа для matcherMap собственности. Это должна быть строка, и вы были там неправы.

В вашем случае, C является Spring Batch Item быть написаны и T является ItemWriter.

Надеюсь, это поможет!

+0

Спасибо, что ответили на мой вопрос. В какой-то степени ваш ответ помогает мне. И я хочу добавить одно, что я возвращаю список, который я забыл опубликовать в коде. Извините за то, что вы беспокоились. – rucha

+0

Думаю, вам не обязательно возвращать список, но только 'person.getOperationType()' из классификатора. Кроме того, я думаю, список, возвращаемый процессором для записи, будет автоматически фильтроваться, вы не должны делать эту фильтрацию. –

+0

Хорошо, теперь я изменил свой код. Я возвращаю строку только как вы сказали 'person.getOperationType()'. Теперь у меня есть составной редактор, в котором у меня есть два сценария, один из которых - 'файлWriter', который всегда будет записываться в файл, а другой -« DatabaseClassifierItemWriter », поскольку я сопоставляю ключ ввода с ссылочным значением как« jdbcInsertItemWriter »,« jdbcUpdateItemWriter »и 'jdbcDeleteItemWriter'. Но теперь ни мой файл не генерируется, ни встраивается в db. А также ошибок нет. – rucha