使用Spring和Lettuce接收Redis流数据

时间:2019-09-20 14:02:57

标签: redis spring-data-redis

我有下面的Spring boot代码,以便在Redis流附加新记录时接收值。问题在于,接收方永远不会收到任何消息,而且订阅者在用subscriber.isActive()进行检查时始终处于非活动状态。这段代码有什么问题?我错过了什么? Doc供参考。

在Spring Boot启动时,初始化必要的Redis资源

莴苣连接工厂

@Bean
public RedisConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory("127.0.0.1", 6379);
}

来自连接工厂的RedisTemplate

@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    return redisTemplate;
}

将数据追加到Redis流的其余控制器

@PutMapping("/{name}")
public String post(@PathVariable String name) {
    return redisTemplate.opsForStream().add(StreamRecords.newRecord().in("streamx").ofObject(name)).getValue();
}

JMS样式命令式消息侦听器

@Component
public class MyStreamListener implements StreamListener<String, MapRecord<String, String, String>> {

@Override
public void onMessage(MapRecord<String, String, String> message) {
    System.out.println("message received: " + message.getValue());
}

}

初始化监听器

  @Bean
public Subscription listener(MyStreamListener streamListener, RedisConnectionFactory redisConnectionFactory) throws InterruptedException {
    StreamMessageListenerContainer<String, MapRecord<String, String, String>> container = StreamMessageListenerContainer
            .create(redisConnectionFactory);
    Subscription subscription = container.receive(Consumer.from("my-group-1", "consumer-1"),
            StreamOffset.create("streamx", ReadOffset.latest())), streamListener);
    System.out.println(subscription.isActive()); // always false
    return subscription;
}

不过,我可以通过api附加到流中。

1 个答案:

答案 0 :(得分:0)

重要的步骤是在完成订阅后启动merge_col_counter <- 0 column_counter <- 0 merged_column_list <- list() for(table in subset_list) { merge_col_counter <- merge_col_counter + 1 for (column in names(varechem_binary)) { column_counter <- column_counter + 1 current_name <- paste(names(subset_list)[merge_col_counter], names(varechem_binary)[column_counter], sep = "_") print(current_name) tmp <- merge(table, varechem_binary[, column_counter, drop = FALSE], by = "row.names") row.names(tmp) <- tmp$Row.names tmp <- tmp[, -1] merged_column_list[[current_name]] <- tmp rm(tmp) } column_counter <- 0 }

StreamMessageListenerContainer