весенняя партия джунит с несколькими источниками данных. Spring данных JPA не удалось сохранить данные в памяти базы данных - PullRequest
0 голосов
/ 24 марта 2020

Мой сценарий заключается в том, что пакетное задание должно считывать данные из 1 БД (H2) и выгружать данные в другую БД (postgres). Поэтому я настроил несколько источников данных

Я написал пакетное задание с использованием пружинного пакета 4.2 и весенняя загрузка 2.2.5. ВЫПУСК. Теперь мне нужно написать тестовый сценарий для сквозного тестирования.

Я использовал пользовательский Batch Configurer с помощью ResourcelessTransactionManager, чтобы избежать сохранения метаданных таблицы пакетов в оперативной памяти и в реальной базе данных, и это работает. Однако я не могу сохранить бизнес-данные в базе данных H2 в памяти в junit, вызвав readerRepository.save (randomReader); и то же самое работает, если я заменяю базу данных H2 в памяти на postgres testconatiner в junit.

Образец junit хранилища test

@Slf4j
@SpringBootTest
@Import(LiquibaseConfigReader.class)
class ReaderRepositoryTest {

    @Autowired
    private ReaderRepository readerRepository;

    @BeforeEach
    void setUp() {
        readerRepository.deleteAll();
    }

    @Test
    void shouldFetchAllRecords() {
        var randomReader = RandomDataGenerator.randomReader();
        assertThat(readerRepository.findAll()).hasSize(0);
        readerRepository.save(randomReader);
        assertThat(readerRepository.findAll()).hasSize(1);
    }
}

Я не могу понять, почему я могу сохранить данные в postgres тестовом контейнере, но не в базе данных H2 в памяти при запуске Junit Test .

Чтобы сохранить метаданные таблицы пакетов в карте памяти, я попробовал следующие решения и теперь метаданные таблицы пакета нигде не сохраняются в DB. Однако я столкнулся с проблемой jpa данных Spring в junit, как упоминалось выше.

Java Spring Batch с использованием встроенной базы данных для метаданных и вторая база данных для других данных

Пружинная загрузка + пружинная партия без источника данных

https://github.com/riversoforion/spring-batch-inmem/blob/master/src/main/java/com/example/batch/CustomBatchConfigurer.java

Это из-за ResourcelessTransactionManager? Если да, как я могу избежать сохранения метаданных таблицы партии в любой базе данных, в том числе в оперативной памяти.

Я пролистал несколько приведенных здесь вопросов, но ни один из них не может сохранить бизнес-данные в базе данных h2.

1 Ответ

0 голосов
/ 24 марта 2020

Трудно ответить без вашего исходного кода. Насколько я понимаю, вы хотите иметь одну БД для чтения данных из ( H2 ) и одну для записи данных в (* 1044) *).

И вы не хотите, чтобы Spring batch записывал свои метаданные в обе базы данных.

Затем вы пишете, что не можете понять, почему вы можете ' t записать в H2 - Полагаю, здесь вы имеете в виду только метаданные весенней партии.

Таким образом, возможное решение может заключаться в изменении BatchConfigurer:

...
public class CustomBatchConfigurer extends DefaultBatchConfigurer {

    @Autowired
    @Qualifier("repoDataSource")
    private DataSource dataSource;

    @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
        factoryBean.setDatabaseType(DatabaseType.POSTGRES.getProductName());
        factoryBean.setTablePrefix("TMP_");
        factoryBean.setIsolationLevelForCreate("ISOLATION_REPEATABLE_READ");
        factoryBean.setDataSource(this.dataSource);
        factoryBean.afterPropertiesSet();
        return factoryBean.getObject();
    }

Здесь вы автоматически подключаете источник данных repoDataSource, затем createJobRepository() перезаписывается, который DefaultBatchConfigurer использует для создания JobRepository. Вместо значения по умолчанию BATCH_ используется префикс таблицы TMP_, а вместо значения по умолчанию ISOLATION_SERIALIZED уровень изоляции транзакции установлен на ISOLATION_REPEATABLE_READ.

Spring не вызывает ни один из create -методов в DefaultBatchConfigurer непосредственно как определения бинов, поэтому InitializingBean afterPropertiesSet() и FactoryBean getObject() должны вызываться явно.

Если вы действительно не хотите, чтобы Spring Batch выполнял большую часть вашей работы и справки по управлению пакетами с метаданными, ваш вопрос является возможным дубликатом Spring-Batch без сохранения метаданных в базе данных? .

...