2017-01-06 2 views
0

Je souhaite écouter les événements d'expiration avec KeyExpirationEventMessageListener mais je ne trouve pas d'exemple. Quelqu'un sait comment le faire en utilisant Spring boot 1.4.3 & Spring Data Redis?Données printanières redis - écouter l'événement d'expiration

Je suis actuellement ce

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); 
    this.jedis = pool.getResource(); 
    this.jedis.psubscribe(new JedisPubSub() { 
     @Override 
     public void onPMessage(String pattern, String channel, String message) { 
      System.out.println("onPMessage pattern " + pattern + " " + channel + " " + message); 
      List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() { 
       public List<Object> execute(RedisOperations operations) throws DataAccessException { 
        operations.multi(); 
        operations.opsForValue().get("val:" + message); 
        operations.delete("val:" + message); 
        return operations.exec(); 
       } 
      }); 
      System.out.println(txResults.get(0)); 
     } 
    }, "[email protected]__:expired"); 

Je voudrais utiliser Spring au lieu de Jedis directement.

Cordialement

Répondre

0

Ne pas utiliser KeyExpirationEventMessageListener comme il déclenche RedisKeyExpiredEvent qui conduit alors à une défaillance RedisKeyValueAdapter.onApplicationEvent.

utiliser plutôt RedisMessageListenerContainer:

@Bean 
RedisMessageListenerContainer keyExpirationListenerContainer(RedisConnectionFactory connectionFactory) { 

    RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer(); 
    listenerContainer.setConnectionFactory(connectionFactory); 

    listenerContainer.addMessageListener((message, pattern) -> { 

     // event handling comes here 

    }, new PatternTopic("[email protected]*__:expired")); 

    return listenerContainer; 
} 

RedisMessageListenerContainer exécute toutes les notifications sur un propre fil.