1

Wir verwenden spring-boot-starter-parent 1.4.1 zusammen mit spring-boot-starter-redis und spring-boot-starter-data-redis. Wir verwenden redis für (a) Nachrichten, die an eine externe App übergeben werden und (b) um einige Informationen in einem Repository zu speichern. Unsere redis Config sieht wie folgt ausSpring Data Redis - @Transaktionsunterstützung für Repository

@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 

Mit dieser Konfigurations des Message Passing ist schön sowie das Schreiben zu arbeiten/aus dem Repository zu lesen. Jetzt versuche ich @Transactional arbeiten für die Kommunikation mit dem Repository, aber ich war bisher nicht gelungen. Ich folgte bereits das Beispiel config in der docs und manuell aktiviert Transaktionsunterstützung auf sie:

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

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

... aber das ist offenbar nicht der Weg zu gehen. Derzeit bleibt alles, was in das Repository geschrieben wurde (insbesondere während der Tests), dort gespeichert.

Antwort

2

@Transactional Verwendung von Redis-Repositories ist nicht möglich, und ich bezweifle, dass es überhaupt funktioniert.

Der Grund ist, wie Spring Data Redis Repository Unterstützung funktioniert: RedisKeyValueAdapter stützt sich auf Ergebnisse von write und read Operationen, die ausgegeben werden, während ein Objekt persistierenden.

Redis-Transaktionen verhalten sich mehr wie zurückgestellte Batches. Daher ist es nicht möglich, die Redis-Repository-Unterstützung in eine Transaktion zu integrieren, sondern eine andere Vorgehensweise und mehrere Einschränkungen.

Verwandte Themen