【问题标题】:How do I configure additional MessageListener to the RedisMessageListenerContainer provided by Spring Session?如何为 Spring Session 提供的 RedisMessageListenerContainer 配置额外的 MessageListener?
【发布时间】: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


    【解决方案1】:

    您可以通过将 RedisMessageListenerContainer bean 命名为 redisMessageListenerContainer 来覆盖 Spring Session 的 RedisHttpSessionConfiguration 提供的 RedisMessageListenerContainer bean。

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

    【讨论】:

    • 请提供sn-ps或链接。没有它就没有任何意义
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2019-09-13
    相关资源
    最近更新 更多