SpringBatch - Как отследить, успешно ли происходит обновление или нет - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 2 ItemWriters, один для вставки БД и один для обновления БД.

С использованием ClassifierCustomItemWriter, который я вызываю соответствующим ItemWriter для новой записи и обновляю существующие записи.

Здесь у меня есть беспокойство.Как узнать, произошло обновление или нет?Например, если «Идентификатор приложения» не существует в БД, ItemWriter не выдаст никакой ошибки, но я хочу знать, что обновление для этой записи не произошло, и зарегистрировать его.

Как я могу отслеживатьчто?

@Bean
    public ClassifierCompositeItemWriter<TRSBatchEntryFormRequest> classifierCompositeItemWriter(ItemWriter<TRSBatchEntryFormRequest> databaseTableItemWriter, ItemWriter<TRSBatchEntryFormRequest> databaseTableUpdateItemWriter) {
        ClassifierCompositeItemWriter<TRSBatchEntryFormRequest> classifierCompositeItemWriter = new ClassifierCompositeItemWriter<>();
        classifierCompositeItemWriter.setClassifier((Classifier<TRSBatchEntryFormRequest, ItemWriter<? super TRSBatchEntryFormRequest>>) trsBatchEntryFormRequest -> {
            if (trsBatchEntryFormRequest.getForm_status().equals("New")) {

                return databaseTableItemWriter;
            } else {

                return databaseTableUpdateItemWriter;
            }
        });
        return classifierCompositeItemWriter;
    }


 // Writer for DB
    @Bean
    public ItemWriter<TRSBatchEntryFormRequest> databaseTableItemWriter(DataSource springBatchDatasource) {
        JdbcBatchItemWriter<TRSBatchEntryFormRequest> databaseItemWriter = new JdbcBatchItemWriter<TRSBatchEntryFormRequest>();
        databaseItemWriter.setDataSource(springBatchDatasource);
        logger.info("INSERT QUERY....:  " + QUERY_INSERT_TRSEntryForms);
        databaseItemWriter.setSql(QUERY_INSERT_TRSEntryForms);
        databaseItemWriter.setItemSqlParameterSourceProvider(new TRSDBInputProvider());
        return databaseItemWriter;
    }

    //Update Writer for DB
    @Bean
    public ItemWriter<TRSBatchEntryFormRequest> databaseTableUpdateItemWriter(DataSource springBatchDatasource) {
        JdbcBatchItemWriter<TRSBatchEntryFormRequest> databaseItemWriter = new JdbcBatchItemWriter<TRSBatchEntryFormRequest>();
        databaseItemWriter.setDataSource(springBatchDatasource);
        logger.info("UPDATE QUERY....:  " + QUERY_UPDATE_TRSEntryForms);
        databaseItemWriter.setSql(QUERY_UPDATE_TRSEntryForms);
        databaseItemWriter.setItemSqlParameterSourceProvider(new TRSDBInputProvider());
        return databaseItemWriter;
    }

Спасибо

1 Ответ

0 голосов
/ 01 марта 2019

Вы не можете отследить это с CompositeItemWriter.Что вы можете сделать, так это использовать пользовательский элемент записи, подобный следующему:

import java.util.List;

import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;

public class TRSBatchEntryFormRequestItemWriter implements ItemWriter<TRSBatchEntryFormRequest> {

    private static final String INSERT_ITEM = "insert into item...";
    private static final String UPDATE_ITEM = "update item set...";

    private JdbcTemplate jdbcTemplate;

    public TRSBatchEntryFormRequestItemWriter(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void write(List<? extends TRSBatchEntryFormRequest> items) throws Exception {
        for (TRSBatchEntryFormRequest item : items) {
            int updated = jdbcTemplate.update(UPDATE_ITEM);
            if (updated == 0) {
                jdbcTemplate.update(INSERT_ITEM);
            }
        }
    }
}

Идея состоит в том, чтобы попытаться выпустить обновление.Если операция возвращает 0, это означает, что ни одна строка не была обновлена, и элемент не существует в базе данных, и в этом случае вы можете выполнить вставку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...