Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何将其他MessageListener配置到Spring会话提供的RedisMessageListenerContainer?_Spring Boot_Redis_Publish Subscribe_Spring Session - Fatal编程技术网

Spring boot 如何将其他MessageListener配置到Spring会话提供的RedisMessageListenerContainer?

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

我有一个工作的Redis发布子配置,如spring boot Redis发布子指南所述

以下是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会话。 因此,我添加了一个配置类

@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
bean
RedisMessageListenerContainer
来覆盖Spring会话的
RedishtpSessionConfiguration
提供的
RedisMessageListenerContainer
bean


当然,在这种情况下,您还需要使用bean手动配置所需的,如果需要,还需要应用
RedisHttpSessionConfiguration#redisMessageListenerContainer

的其他部分。请提供代码片段或链接。没有这个就没有任何意义