Nano Hash - криптовалюты, майнинг, программирование

Spring Batch - ItemWriter записывает тот же объект, который прочитал ItemReader, но не тот, который был возвращен после обработки через ItemProcessor

Мой сценарий: JdbcPagingItemReader читает из Oracle db и возвращает объект, скажем, «Сотрудник». Затем этот объект «Employee» передается процессору, чтобы сделать еще один вызов db, чтобы извлечь дополнительную информацию из нескольких таблиц и вернуть объект «AggregatedEmployee» (фактически он расширяет Employee). Я использую KafkaItemWriter для записи обработанного объекта в Kafka, но вместо записи AggregatedEmployee писатель пытается написать сам «Сотрудник».

@Mahmoud Ben Hassine: Я видел много ваших предложений по Spring Batch. Пожалуйста, поделитесь своими мыслями.

Код интерфейса процессора:

public interface PageProcessor<T> {
       <R extends Employee> R process(T page);
}

Код Step Bean:

@Bean
protected Step step1 (CompositeJdbcPagingItemReader <Employee> reader, KafkaItemWriter <String, AggregatedEmployee> writer) {
    return steps.get("step1")
                .<Employee, AggregatedEmployee>chunk(5).
                reader(reader).
                writer(writer).build();
    }

Класс реализации кода интерфейса процессора:

public class EmployeeProcessor implements PageProcessor<Employee> {
    private NamedParameterJdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @SuppressWarnings("unchecked")
    @Override
    public <R extends Employee> R process(Employee page) {
             ... implementation goes here
    }

KafkaItemWriter Bean:

    @Bean
    KafkaItemWriter<String,AggregatedEmployee> writer(){
        return new KafkaItemWriterBuilder<String, AggregatedEmployee>()
                .kafkaTemplate(aggregatedEmployeekafkaTemplate)
                .itemKeyMapper(aggregatedEmployee -> String.valueOf(aggregatedEmployee.getEmployeeId()))
                .build();
    }

Отредактировано, чтобы показать процессор:

public class CompositeJdbcPagingItemReader<T> extends JdbcPagingItemReader<T> {
    private PageProcessor<T> pageProcessor;

    public void setPageProcessor(PageProcessor<T> pageProcessor) {
        this.pageProcessor = pageProcessor;
    }

И когда создается bean-компонент Reader, объект процессора также создается и устанавливается в считыватель с помощью показанного выше установщика, и логика процессора, написанная в EmployeeProcessor, также выполняется.

Ошибка:

java.lang.ClassCastException: class com.sample.model.Employee cannot be cast to class com.sample.model.AggregatedEmployee (com.sample.model.Employee and com.sample.model.AggregatedEmployee are in unnamed module of loader 'app')
    at org.springframework.batch.item.KeyValueItemWriter.write(KeyValueItemWriter.java:43)

  • Удалите этот @SuppressWarnings("unchecked") и проверьте, где находится предупреждение. Ваши типы ошибочны. 17.09.2020

Ответы:


1

Вы не ставили процессор на свой шаг:

@Bean
protected Step step1 (CompositeJdbcPagingItemReader <Employee> reader, KafkaItemWriter <String, AggregatedEmployee> writer) {
return steps.get("step1")
            .<Employee, AggregatedEmployee>chunk(5).
            reader(reader).
            writer(writer).build();
}

Вам необходимо установить процессор, который будет выполнять преобразование типов Employee - ›AggregatedEmployee на вашем шаге.

18.09.2020
  • Я забыл упомянуть, что мой процессор был настроен в самом ридере, как показано ниже. См. Отредактированный фрагмент кода выше 19.09.2020
  • Это не очень хорошая идея, ваш ридер выполняет две задачи одновременно и подключен к вашему процессору. Более того, Spring Batch не будет вызывать ваш процессор, поэтому преобразование Employee в AggregatedEmployee не произойдет, что является причиной вашей проблемы. 19.09.2020
  • Спасибо Махмуду Бен Хассину. Я отделил процессор от ридера, и все заработало, как ожидалось. 21.09.2020
  • хорошо, здорово, рад, что помог! В этом случае примите ответ: stackoverflow.com/help/someone-answers. Обратите внимание, что принятие ответа отличается от его поддержки. 21.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..