2016-07-11 7 views
0

У меня была работающая конфигурация паба Redis, как объяснялось в вспомогательном гид-магазине redis pub spring.Как настроить дополнительный MessageListener в RedisMessageListenerContainer, предоставленный Spring Session?

Вот конфигурация боб для RedisMessageListenerContainer

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

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

Теперь я хотел использовать весеннюю сессию поддержанный Redis. Итак, я добавил класс конфигурации как это.

@EnableRedisHttpSession 
public class HttpSessionConfig { 

} 

Теперь, потому что RedisHttpSessionConfig уже определяет RedisMessageListenerContainer, я получаю это исключение при запуске.

Вызванный: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Нет квалификационных фасоли типа [org.springframework.data.redis.listener.RedisMessageListenerContainer] не определен: ожидается, одного соответствия фасоли, но обнаружил 2: контейнер, redisMessageListenerContainer

чтобы обойти это, я закомментируйте redisMessageListenerContainer, определенные в моем ApplicationConfig так, что есть только один контейнер для кофейных зерен, но тогда проблема

Как настроить мой слушатель, чтобы добавить к существующему контейнеру, предоставленному redisMessageListenerContainer ?

ОК. Мне удалось решить проблему, удалив компонент RedisMessageListenerContainer и введя его как параметр метода в моей конфигурации компонента MessageListenerAdaper.

@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; 
} 

Но это не кажется чистым решением, как я декорирование RedisMessageListenerContainer боба внутри MessageListenerAdaper фасоли. Любые лучшие идеи?

ответ

-1

Вы можете переопределить фасоль RedisMessageListenerContainer, предоставленную Весной Сессией RedisHttpSessionConfiguration, назвав ваш RedisMessageListenerContainer bean redisMessageListenerContainer.

Конечно, в этом случае вам также необходимо вручную настроить нужный message listeners с вашим компонентом и, при необходимости, также применить другие части RedisHttpSessionConfiguration#redisMessageListenerContainer.

+1

Просьба предоставить фрагменты или ссылки. Не имеет никакого смысла без этого –