2016-07-11 26 views
0

Ich hatte eine funktionierende Redis Pub-Sub-Konfiguration, wie im Spring-Boot-Redispub-Sub-Guide erklärt. HierWie konfiguriere ich einen zusätzlichen MessageListener für den RedisMessageListenerContainer, der von Spring Session bereitgestellt wird?

ist die Bean-Konfiguration für die RedisMessageListenerContainer

@Bean 
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, 
     MessageListenerAdapter listenerAdapter) { 

    RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 
    container.setConnectionFactory(connectionFactory); 
    container.addMessageListener(listenerAdapter, new ChannelTopic("broadcast")); 
    return container; 
} 

Nun wollte ich Frühjahrssitzung verwenden, durch redis gesichert. Also habe ich eine Konfigurationsklasse wie folgt hinzugefügt.

@EnableRedisHttpSession 
public class HttpSessionConfig { 

} 

Jetzt, da RedisHttpSessionConfig bereits eine RedisMessageListenerContainer definiert, erhalte ich diese Ausnahme auf Start.

Verursacht durch: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Keine Warte Bean vom Typ [org.springframework.data.redis.listener.RedisMessageListenerContainer] definiert: Bohne Einzelanpassung erwartet, aber gefunden 2: Behälter, redisMessageListenerContainer

um das zu bekommen, ich die RedisMessageListenerContainer kommentieren Sie in meinem ApplicationConfig so definiert, dass es nur einen Behälter Bohne ist aber das Problem dann ist

Wie konfiguriere ich meine Zuhörer an den vorhandenen Behälter durch redisMessageListenerContainer bereitgestellt hinzufügen ?

Ok Ich konnte das Problem umgehen, indem ich das RedisMessageListenerContainer-Bean löschte und es als Methodenparameter in meine MessageListenerAdaper-Bean-Konfiguration einfügte.

@Bean 
MessageListenerAdapter listenerAdapter(RedisMessageListenerContainer container, PushNotificationsService receiver) { 

    MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(receiver, "receiveMessage"); 
    listenerAdapter.setSerializer(new Jackson2JsonRedisSerializer<NotificationMessage>(NotificationMessage.class)); 
    container.addMessageListener(listenerAdapter, new ChannelTopic("broadcast")); 
    return listenerAdapter; 
} 

Aber dies ist nicht eine saubere Lösung scheint, wie ich die RedisMessageListenerContainer Bohne aus dem Inneren der MessageListenerAdaper Bohne bin zu dekorieren. Irgendwelche besseren Ideen?

Antwort

-1

Sie können die RedisMessageListenerContainer Bean, die von Spring Sessions RedisHttpSessionConfiguration bereitgestellt wird, überschreiben, indem Sie Ihre RedisMessageListenerContainer Bean redisMessageListenerContainer benennen.

Natürlich müssen Sie in diesem Fall auch die erforderliche message listeners mit Ihrer Bean manuell konfigurieren und, falls erforderlich, auch andere Teile von RedisHttpSessionConfiguration#redisMessageListenerContainer anwenden.

+1

Bitte Snippets oder Links bereitstellen. Ohne das macht es keinen Sinn –