gpt4 book ai didi

java - 测试辅助线程上的事务同步

转载 作者:行者123 更新时间:2023-12-02 08:55:49 24 4
gpt4 key购买 nike

我正在对由 2 个集成流组成的 spring 集成流程进行集成测试。

第一个流程从用户/测试中获取消息并将其推送到 jdbc 支持的 (H2DB) 消息队列中。

第二个流程由事务轮询器驱动,该轮询器从同一队列中抓取排队的消息并将其写入文件夹。

测试会定期检查文件夹内容,如果在预设超时之前成功找到文件夹内的文件,则测试成功。

有时,测试会在轮询器事务有时间提交之前找到该文件并开始关闭 Spring 上下文,在这种情况下,我的测试会死得很惨,并用最后的“无法提交 JDBC 事务”来诅咒我,数据库不再可用”异常。

1) 如何避免我的测试在轮询器事务提交之前退出?

注意:因为轮询器事务不在测试线程内,所以我(可能)不能利用 Spring 提供的常用功能进行事务测试。

我当前的想法是不仅检查文件是否存在,还断言消息队列是否为空。我相信轮询器事务应该防止测试线程看到空队列,直到事务提交(无脏读)。

2) Spring(集成)默认的 H2 事务隔离级别是否能保证我避免脏读?

最佳答案

最好在退出测试之前停止该轮询器。或者在该测试方法结束之前停止该队列 channel 的 AbstractEndpoint。或者,如果您依赖 Spring 测试框架进行应用程序上下文管理,请考虑使用 @DirtiesContext

问题在于轮询器实际上在其自己的计划线程中工作,当您的测试准备好对某些轮询结果进行断言时,该进程仍然在后台运行其他轮询周期。

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;

关于java - 测试辅助线程上的事务同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com