1

我们使用spring-boot-starter-parent 1.4.1以及spring-boot-starter-redisspring-boot-starter-data-redis。我们使用(一)传递给外部应用程序和(b)存储在库中的一些信息消息Redis的。我们Redis的配置看起来像这样Spring Data Redis - 存储库中的@Transactional支持

@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与库通讯的工作,但我至今没有成功。我已经遵循了docs就可以了例如配置和手动启用事务支持:

@Bean 
open fun redisTemplate(): RedisTemplate<*, *> { 

    val template = RedisTemplate<ByteArray, ByteArray>() 
    template.setEnableTransactionSupport(true) 
    return template 
} 

...但是这显然不是要走的路。目前,一切都(在测试过程中尤其是)写入到存储库在那里停留。

回答

2

@Transactional使用Redis的库是不可能的,我怀疑它会在所有的工作。

的背后原因是春季Redis的数据仓库的支持是如何工作的: RedisKeyValueAdapter依赖于那些在坚持一个对象发出writeread经营业绩。

Redis事务更像延迟批处理,因此无法在事务内部包装Redis存储库支持,但需要采用不同的方法并施加若干限制。