Spring boot 如何将其他MessageListener配置到Spring会话提供的RedisMessageListenerContainer?
我有一个工作的Redis发布子配置,如spring boot Redis发布子指南所述 以下是RedisMessageListenerContainer的bean配置Spring boot 如何将其他MessageListener配置到Spring会话提供的RedisMessageListenerContainer?,spring-boot,redis,publish-subscribe,spring-session,Spring Boot,Redis,Publish Subscribe,Spring Session,我有一个工作的Redis发布子配置,如spring boot Redis发布子指南所述 以下是RedisMessageListenerContainer的bean配置 @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerCon
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new ChannelTopic("broadcast"));
return container;
}
现在我想利用redis支持的spring会话。
因此,我添加了一个配置类
@EnableRedisHttpSession
public class HttpSessionConfig {
}
现在,因为RedisHttpSessionConfig已经定义了一个RedisMessageListenerContainer,所以我在开始时得到了这个异常
原因:org.springframework.beans.factory.NoniqueBeandDefinitionException:未定义类型为[org.springframework.data.redis.listener.RedisMessageListenerContainer]的符合条件的bean:应为单个匹配的bean,但找到2:容器,RedisMessageListenerContainer
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new ChannelTopic("broadcast"));
return container;
}
为了解决这个问题,我注释掉了ApplicationConfig中定义的RedisMessageListenerContainer,这样只有一个容器bean,但问题是
如何配置侦听器以添加到由提供的现有容器中
redisMessageListenerContainer
好的,我可以通过删除RedisMessageListenerContainer bean,并将其作为方法参数注入MessageListenerAdapter 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;
}
@Bean
MessageListenerAdapter listenerAdapter(RedisMessageListenerContainer容器,PushNotificationsService接收器){
MessageListenerAdapter listenerAdapter=newmessagelisteneradapter(接收方,“receiveMessage”);
setSerializer(新的Jackson2JSONRedisalizer(NotificationMessage.class));
addMessageListener(listenerAdapter,新频道主题(“广播”);
返回listenerAdapter;
}
但这似乎不是一个干净的解决方案,因为我正在从MessageListenerAdapter bean内部装饰RedisMessageListenerContainer bean。
有更好的主意吗?您可以通过命名
RedisMessageListenerContainer
beanRedisMessageListenerContainer
来覆盖Spring会话的RedishtpSessionConfiguration
提供的RedisMessageListenerContainer
bean
当然,在这种情况下,您还需要使用bean手动配置所需的,如果需要,还需要应用
RedisHttpSessionConfiguration#redisMessageListenerContainer
的其他部分。请提供代码片段或链接。没有这个就没有任何意义