弹簧数据重新播放 - @transactional支持存储库



我们将使用spring-boot-starter-parent 1.4.1与spring-boot-starter-redisspring-boot-starter-data-redis一起使用。我们将REDIS用于(a)传递到外部应用程序和(b)将一些信息存储在存储库中。我们的redis配置看起来像这样

@Configuration
@EnableRedisRepositories
open class RedisConfig {
    @Bean // for message passing
    @Profile("test")
    open fun testRedisChannelProvider(): RedisParserChannelProvider {
        return RedisParserChannelProvider("test_parser:parse.job", "test_parser:parse.joblist")
    }
    @Bean // for message passing
    @Profile("!test")
    open fun productionRedisChannelProvider(): RedisParserChannelProvider {
        return RedisParserChannelProvider("parser:parse.job", "parser:parse.joblist")
    }
    @Bean // for message passing
    open fun parseJobTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate<String, ParseJob> {
        val template = RedisTemplate<String, ParseJob>()
        template.connectionFactory = connectionFactory
        template.valueSerializer = Jackson2JsonRedisSerializer<ParseJob>(ParseJob::class.java)
        return template
    }
    //@Bean // for message passing
    //open fun parseJobListTemplate ...
    // no template for repository

使用此配置,消息传递工作正常,并且从存储库写入/阅读。现在,我试图让@Transactional与存储库进行通信,但到目前为止我还没有成功。我已经在文档中遵循了示例配置,并在其中手动启用了交易支持:

@Bean
open fun redisTemplate(): RedisTemplate<*, *> {
    val template = RedisTemplate<ByteArray, ByteArray>()
    template.setEnableTransactionSupport(true)
    return template
}

...但这显然不是要走的路。当前,写给存储库的所有内容(尤其是在测试期间)留在那里。

@Transactional使用redis存储库是不可能的,我怀疑它是否会起作用。

背后的原因是Spring Data Redis存储库支持如何有效: RedisKeyValueAdapter依赖于在持续存在对象时发出的写入和读取操作的结果。

redis交易的行为更像是递延批次,因此不可能将Redis存储库支持包装在交易中,但需要不同的方法并施加了几个限制。

最新更新