@@ -113,6 +113,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
113
113
private RedisOperations <?, ?> redisOps ;
114
114
private RedisConverter converter ;
115
115
private @ Nullable RedisMessageListenerContainer messageListenerContainer ;
116
+ private boolean managedListenerContainer = true ;
116
117
private final AtomicReference <KeyExpirationEventMessageListener > expirationListener = new AtomicReference <>(null );
117
118
private @ Nullable ApplicationEventPublisher eventPublisher ;
118
119
@@ -195,7 +196,6 @@ public RedisKeyValueAdapter(RedisOperations<?, ?> redisOps, RedisConverter redis
195
196
196
197
this .converter = redisConverter ;
197
198
this .redisOps = redisOps ;
198
- initMessageListenerContainer ();
199
199
}
200
200
201
201
/**
@@ -236,7 +236,7 @@ public Object put(Object id, Object item, String keyspace) {
236
236
237
237
connection .hMSet (objectKey , rdo .getBucket ().rawMap ());
238
238
239
- if (isNew ) {
239
+ if (isNew ) {
240
240
connection .sAdd (toBytes (rdo .getKeyspace ()), key );
241
241
}
242
242
@@ -351,7 +351,7 @@ public <T> T delete(Object id, String keyspace, Class<T> type) {
351
351
connection .sRem (binKeyspace , binId );
352
352
new IndexWriter (connection , converter ).removeKeyFromIndexes (asString (keyspace ), binId );
353
353
354
- if (RedisKeyValueAdapter .this .keepShadowCopy ()) {
354
+ if (RedisKeyValueAdapter .this .keepShadowCopy ()) {
355
355
356
356
RedisPersistentEntity <?> persistentEntity = converter .getMappingContext ().getPersistentEntity (type );
357
357
if (persistentEntity != null && persistentEntity .isExpiring ()) {
@@ -524,7 +524,7 @@ public void update(PartialUpdate<?> update) {
524
524
525
525
connection .persist (redisKey );
526
526
527
- if (keepShadowCopy ()) {
527
+ if (keepShadowCopy ()) {
528
528
connection .del (ByteUtils .concat (redisKey , BinaryKeyspaceIdentifier .PHANTOM_SUFFIX ));
529
529
}
530
530
}
@@ -685,7 +685,6 @@ private <T> T readBackTimeToLiveIfSet(@Nullable byte[] key, @Nullable T target)
685
685
686
686
/**
687
687
* @return {@literal true} if {@link RedisData#getTimeToLive()} has a positive value.
688
- *
689
688
* @param data must not be {@literal null}.
690
689
* @since 2.3.7
691
690
*/
@@ -703,6 +702,28 @@ public void setEnableKeyspaceEvents(EnableKeyspaceEvents enableKeyspaceEvents) {
703
702
this .enableKeyspaceEvents = enableKeyspaceEvents ;
704
703
}
705
704
705
+ /**
706
+ * Configure a {@link RedisMessageListenerContainer} to listen for Keyspace expiry events. The container can only be
707
+ * set when this bean hasn't been yet {@link #afterPropertiesSet() initialized}.
708
+ *
709
+ * @param messageListenerContainer the container to use.
710
+ * @since 2.6.6
711
+ * @throws IllegalStateException when trying to set a {@link RedisMessageListenerContainer} after
712
+ * {@link #afterPropertiesSet()} has been called to initialize a managed container instance.
713
+ */
714
+ public void setMessageListenerContainer (RedisMessageListenerContainer messageListenerContainer ) {
715
+
716
+ Assert .notNull (messageListenerContainer , "RedisMessageListenerContainer must not be null" );
717
+
718
+ if (this .managedListenerContainer && this .messageListenerContainer != null ) {
719
+ throw new IllegalStateException (
720
+ "Cannot set RedisMessageListenerContainer after initializing a managed RedisMessageListenerContainer instance" );
721
+ }
722
+
723
+ this .managedListenerContainer = false ;
724
+ this .messageListenerContainer = messageListenerContainer ;
725
+ }
726
+
706
727
/**
707
728
* Configure the {@literal notify-keyspace-events} property if not already set. Use an empty {@link String} or
708
729
* {@literal null} to retain existing server settings.
@@ -731,6 +752,10 @@ public void setShadowCopy(ShadowCopy shadowCopy) {
731
752
@ Override
732
753
public void afterPropertiesSet () {
733
754
755
+ if (this .managedListenerContainer ) {
756
+ initMessageListenerContainer ();
757
+ }
758
+
734
759
if (ObjectUtils .nullSafeEquals (EnableKeyspaceEvents .ON_STARTUP , this .enableKeyspaceEvents )) {
735
760
initKeyExpirationListener ();
736
761
}
@@ -746,8 +771,9 @@ public void destroy() throws Exception {
746
771
this .expirationListener .get ().destroy ();
747
772
}
748
773
749
- if (this .messageListenerContainer != null ) {
774
+ if (this .managedListenerContainer && this . messageListenerContainer != null ) {
750
775
this .messageListenerContainer .destroy ();
776
+ this .messageListenerContainer = null ;
751
777
}
752
778
}
753
779
0 commit comments