【发布时间】:2016-07-11 19:33:31
【问题描述】:
如 spring boot redis pub sub guide 中所述,我有一个有效的 Redis pub sub 配置。
这是 RedisMessageListenerContainer 的 bean 配置
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new ChannelTopic("broadcast"));
return container;
}
现在我想利用由 redis 支持的 spring session。 所以,我添加了一个这样的配置类。
@EnableRedisHttpSession
public class HttpSessionConfig {
}
现在,因为 RedisHttpSessionConfig 已经定义了一个 RedisMessageListenerContainer ,所以我在启动时遇到了这个异常。
原因:org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有定义 [org.springframework.data.redis.listener.RedisMessageListenerContainer] 类型的合格 bean:预期单个匹配 bean,但找到了 2:container,redisMessageListenerContainer
为了解决这个问题,我注释掉了我的 ApplicationConfig 中定义的 RedisMessageListenerContainer 以便只有一个容器 bean,但问题是
如何配置我的侦听器以添加到由 redisMessageListenerContainer?
好的,我可以通过删除 RedisMessageListenerContainer bean 并将其作为方法参数注入到我的 MessageListenerAdaper bean 配置中来解决这个问题。
@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;
}
但这似乎不是一个干净的解决方案,因为我正在从 MessageListenerAdaper bean 内部装饰 RedisMessageListenerContainer bean。 有更好的想法吗?
【问题讨论】:
标签: spring-boot redis publish-subscribe spring-session