Spring:RedisMessageListenerContainer通过java -jar

时间:2017-08-04 09:47:01

标签: java spring redis spring-data-redis

我的春季应用程序中有以下RedisConfig

@Configuration
public class RedisConfig {

    @Value("${redis.hostname}")
    private String redisHostName;

    @Value("${redis.port}")
    private String redisPort;

    @Value("${intercom.chats.sync.enable}")
    Boolean enableSync;

    private static final Logger log = LoggerFactory.getLogger(RedisConfig.class.getName());

    @Bean
    public RedisMessageSubscriber redisMessageSubscriber() {
        log.debug("Entered redisMessageSubscriber()");
        return new RedisMessageSubscriber();
    }

    @Bean
    public MessageListenerAdapter messageListenerAdapter() {
        log.debug("Entered messageListenerAdapter()");
        MessageListenerAdapter listener = new MessageListenerAdapter(redisMessageSubscriber());
        listener.setSerializer(new StringRedisSerializer());
        return listener;
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisFactory) {
        log.debug("Entered redisMessageListenerContainer");

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisFactory);
        if (!enableSync) {
            log.debug("Subscribing to the redis queue {}");
            // Only set the listener if the sync is not enabled
            container.addMessageListener(messageListenerAdapter(),
                    Arrays.asList(new ChannelTopic(Constants.EVENT_MESSAGE_KEY)));
        }
        container.afterPropertiesSet();
        return container;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(redisHostName);

        // Checking if redisPort string is an integer or not, this is used in
        // the case of CI environment
        if (redisPort.matches("^-?\\d+$")) {
            factory.setPort(Integer.parseInt(redisPort));
        }
        factory.setUsePool(true);
        return factory;
    }

}

redisMessageSubscriber()打印日志,messageListenerAdapter()也打印日志,但redisMessageListenerContainer()不打印任何意味着它永远不会输入。甚至没有输入该功能,因此不会显示其中的2个日志。

结果是它不订阅任何事件。我不明白为什么它不适合我。有人可以分享他们的想法。谢谢!!

编辑:我发现只有当我使用jar -jar命令从终端运行项目时才会发生这种情况。如果我从eclipse启动它可以正常工作:/

1 个答案:

答案 0 :(得分:0)

我能够让它发挥作用。我在配置类上添加了注释@EnableRedisHttpSession,这导致了问题。我猜他们两个(@EnableRedisHttpSessionRedisMessageListenerContainer)不能同时工作,但我想得到更好的答案。 :/