Синхронизация транзакций на тестовом вторичном потоке - PullRequest
0 голосов
/ 02 марта 2020

Я провожу интеграционный тест для процесса пружинной интеграции, состоящего из 2 потоков интеграции.

1-й поток получает сообщение от пользователя / теста и помещает его в очередь сообщений jdb c (H2DB).

2-й поток управляется транзакционным опросчиком, который извлекает сообщение из очереди из той же очереди и записывает его в папку.

Тест периодически проверяет содержимое папки и завершается успешно, если ему удается найти файл в папке до заданного времени ожидания.

Иногда тест находит файл и начинает закрывать контекст Spring до того, как транзакция опроса успевает зафиксировать, и в этом случае мой тест умирает ужасной смертью и проклинает меня окончательным «не может зафиксировать» JDB C транзакция, база данных больше не доступна "исключение.

1) как я могу избежать того, чтобы мой тест завершился до того, как транзакция опроса будет зафиксирована?

Примечание: так как транзакция опроса не находится внутри тестового потока, я могу (вероятно) не использовать обычные возможности, предоставленные Spring для транзакционного тестирования.

Моя текущая идея состоит в том, чтобы проверять не только наличие файла, но и утверждать, что очередь сообщений пуста. Я считаю, что транзакция опроса не должна допускать, чтобы тестовый поток видел пустую очередь до тех пор, пока транзакция не будет зафиксирована (без «грязного чтения»).

2) уровень изоляции транзакций Spring (интеграция) по умолчанию с H2 гарантирует мне избегать грязных чтений?

1 Ответ

1 голос
/ 02 марта 2020

Лучше остановить этот опросор перед выходом из теста. Или остановите AbstractEndpoint для этого канала очереди до окончания этого метода тестирования. Или рассмотрите возможность использования @DirtiesContext, если вы полагаетесь на Spring Testing Framework для управления контекстом приложения.

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

Поддержка Spring Integration полностью основана на основе Spring TX, поэтому значение по умолчанию isolationLevel точно такое, какое вы видите в @Transactional:

/**
 * The transaction isolation level.
 * <p>Defaults to {@link Isolation#DEFAULT}.
 * <p>Exclusively designed for use with {@link Propagation#REQUIRED} or
 * {@link Propagation#REQUIRES_NEW} since it only applies to newly started
 * transactions. Consider switching the "validateExistingTransactions" flag to
 * "true" on your transaction manager if you'd like isolation level declarations
 * to get rejected when participating in an existing transaction with a different
 * isolation level.
 * @see org.springframework.transaction.interceptor.TransactionAttribute#getIsolationLevel()
 * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setValidateExistingTransaction
 */
Isolation isolation() default Isolation.DEFAULT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...