我们将spring-boot-starter-parent
1.4.1与spring-boot-starter-redis
和spring-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
与存储库进行通信,但到目前为止我还没有成功。我已经按照docs中的示例配置并在其上手动启用了事务支持:
@Bean
open fun redisTemplate(): RedisTemplate<*, *> {
val template = RedisTemplate<ByteArray, ByteArray>()
template.setEnableTransactionSupport(true)
return template
}
......但这显然不是可行的方法。目前,写入存储库的所有内容(特别是在测试期间)都会保留在那里。
答案 0 :(得分:4)
@Transactional
使用Redis存储库是不可能的,我怀疑它会起作用。
背后的原因是Spring Data Redis存储库支持的工作原理:
RedisKeyValueAdapter
依赖于持久化对象时发出的write和read操作的结果。
Redis事务的行为更像延迟批处理,因此无法在事务中包含Redis存储库支持,但需要采用不同的方法并施加一些限制。