@@ -112,6 +112,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
112
112
private RedisOperations <?, ?> redisOps ;
113
113
private RedisConverter converter ;
114
114
private @ Nullable RedisMessageListenerContainer messageListenerContainer ;
115
+ private boolean managedListenerContainer = true ;
115
116
private final AtomicReference <KeyExpirationEventMessageListener > expirationListener = new AtomicReference <>(null );
116
117
private @ Nullable ApplicationEventPublisher eventPublisher ;
117
118
@@ -179,7 +180,6 @@ public RedisKeyValueAdapter(RedisOperations<?, ?> redisOps, RedisConverter redis
179
180
180
181
this .converter = redisConverter ;
181
182
this .redisOps = redisOps ;
182
- initMessageListenerContainer ();
183
183
}
184
184
185
185
/**
@@ -216,7 +216,7 @@ public Object put(Object id, Object item, String keyspace) {
216
216
217
217
connection .hMSet (objectKey , rdo .getBucket ().rawMap ());
218
218
219
- if (isNew ) {
219
+ if (isNew ) {
220
220
connection .sAdd (toBytes (rdo .getKeyspace ()), key );
221
221
}
222
222
@@ -311,7 +311,7 @@ public <T> T delete(Object id, String keyspace, Class<T> type) {
311
311
connection .sRem (binKeyspace , binId );
312
312
new IndexWriter (connection , converter ).removeKeyFromIndexes (asString (keyspace ), binId );
313
313
314
- if (RedisKeyValueAdapter .this .keepShadowCopy ()) {
314
+ if (RedisKeyValueAdapter .this .keepShadowCopy ()) {
315
315
316
316
RedisPersistentEntity <?> persistentEntity = converter .getMappingContext ().getPersistentEntity (type );
317
317
if (persistentEntity != null && persistentEntity .isExpiring ()) {
@@ -464,7 +464,7 @@ public void update(PartialUpdate<?> update) {
464
464
465
465
connection .persist (redisKey );
466
466
467
- if (keepShadowCopy ()) {
467
+ if (keepShadowCopy ()) {
468
468
connection .del (ByteUtils .concat (redisKey , BinaryKeyspaceIdentifier .PHANTOM_SUFFIX ));
469
469
}
470
470
}
@@ -625,7 +625,6 @@ private <T> T readBackTimeToLiveIfSet(@Nullable byte[] key, @Nullable T target)
625
625
626
626
/**
627
627
* @return {@literal true} if {@link RedisData#getTimeToLive()} has a positive value.
628
- *
629
628
* @param data must not be {@literal null}.
630
629
* @since 2.3.7
631
630
*/
@@ -643,6 +642,28 @@ public void setEnableKeyspaceEvents(EnableKeyspaceEvents enableKeyspaceEvents) {
643
642
this .enableKeyspaceEvents = enableKeyspaceEvents ;
644
643
}
645
644
645
+ /**
646
+ * Configure a {@link RedisMessageListenerContainer} to listen for Keyspace expiry events. The container can only be
647
+ * set when this bean hasn't been yet {@link #afterPropertiesSet() initialized}.
648
+ *
649
+ * @param messageListenerContainer the container to use.
650
+ * @since 2.7.2
651
+ * @throws IllegalStateException when trying to set a {@link RedisMessageListenerContainer} after
652
+ * {@link #afterPropertiesSet()} has been called to initialize a managed container instance.
653
+ */
654
+ public void setMessageListenerContainer (RedisMessageListenerContainer messageListenerContainer ) {
655
+
656
+ Assert .notNull (messageListenerContainer , "RedisMessageListenerContainer must not be null" );
657
+
658
+ if (this .managedListenerContainer && this .messageListenerContainer != null ) {
659
+ throw new IllegalStateException (
660
+ "Cannot set RedisMessageListenerContainer after initializing a managed RedisMessageListenerContainer instance" );
661
+ }
662
+
663
+ this .managedListenerContainer = false ;
664
+ this .messageListenerContainer = messageListenerContainer ;
665
+ }
666
+
646
667
/**
647
668
* Configure the {@literal notify-keyspace-events} property if not already set. Use an empty {@link String} or
648
669
* {@literal null} to retain existing server settings.
@@ -671,6 +692,10 @@ public void setShadowCopy(ShadowCopy shadowCopy) {
671
692
@ Override
672
693
public void afterPropertiesSet () {
673
694
695
+ if (this .managedListenerContainer ) {
696
+ initMessageListenerContainer ();
697
+ }
698
+
674
699
if (ObjectUtils .nullSafeEquals (EnableKeyspaceEvents .ON_STARTUP , this .enableKeyspaceEvents )) {
675
700
initKeyExpirationListener ();
676
701
}
@@ -682,8 +707,9 @@ public void destroy() throws Exception {
682
707
this .expirationListener .get ().destroy ();
683
708
}
684
709
685
- if (this .messageListenerContainer != null ) {
710
+ if (this .managedListenerContainer && this . messageListenerContainer != null ) {
686
711
this .messageListenerContainer .destroy ();
712
+ this .messageListenerContainer = null ;
687
713
}
688
714
}
689
715
0 commit comments