Spring:当 运行 应用程序通过 java -jar 从命令行运行时,RedisMessageListenerContainer 不工作
Spring: RedisMessageListenerContainer not working when running app from command line via java -jar
我的 spring 应用中有以下 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 个日志中的 none。
结果是它没有订阅任何事件。我不明白为什么它不适合我。有人可以分享他们的想法。谢谢!!
编辑: 我发现只有当我使用 jar -jar 命令从终端 运行 项目时才会发生这种情况。如果我从 eclipse 启动它,它工作正常:/
我成功了。我在配置 class 上添加了注释 @EnableRedisHttpSession
,这是导致问题的原因。我想他们(@EnableRedisHttpSession
和 RedisMessageListenerContainer
)不能同时工作,但我想得到一个更好的答案。 :/
我的 spring 应用中有以下 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 个日志中的 none。
结果是它没有订阅任何事件。我不明白为什么它不适合我。有人可以分享他们的想法。谢谢!!
编辑: 我发现只有当我使用 jar -jar 命令从终端 运行 项目时才会发生这种情况。如果我从 eclipse 启动它,它工作正常:/
我成功了。我在配置 class 上添加了注释 @EnableRedisHttpSession
,这是导致问题的原因。我想他们(@EnableRedisHttpSession
和 RedisMessageListenerContainer
)不能同时工作,但我想得到一个更好的答案。 :/