如果数据在Redis中,我需要向客户端推送一些数据,但是客户端每隔5秒钟会不断重新连接到SSE端点。
后端代码:
@RestController
@RequestMapping("/reactive-task")
public class TaskRedisController {
private final TaskRedisRepository taskRedisRepository;
TaskRedisController(TaskRedisRepository taskRedisRepository){
this.taskRedisRepository = taskRedisRepository;
}
@CrossOrigin
@GetMapping(value = "/get/{id}")
public Flux<ServerSentEvent<Task>> getSseStream2(@PathVariable("id") String id) {
return taskRedisRepository.findByTaskId(id)
.map(task -> ServerSentEvent.<Task>builder().data(task).build());
}
}
@Repository
public class TaskRedisRepository {
public Flux<Task> findByTaskId(String id) {
return template.keys("task:" + id).flatMap(template.opsForValue()::get);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
@Entity
public class Task {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(length = 25)
private String result;
}
客户端使用JS进行消费:
var evt = new EventSource("http://localhost:8080/reactive-task/get/98"); evt.onmessage = function(event) {
console.log(event);
};
有人能指出我正确的方向吗?
任何建议将不胜感激。
更新:我需要在Redis中存储数据一段时间(5-10分钟)。 更新:我在MongoDB上编写了类似的代码,并且工作正常。
答案 0 :(得分:3)
在这种情况下,taskRedisRepository.findByTaskId(id)
可能正在发送有限的Flux
-表示几个元素和完成流的完整信号。
Spring WebFlux将把onComplete
信号解释为流的结尾并关闭它。浏览器SSE客户端的默认行为是在连接终止的情况下立即重新连接到端点。
如果您希望保持持久的连接,并且仅在添加新元素时收到通知,则需要直接将其用作数据存储的功能。对于Redis,发布/订阅功能(see reference documentation)支持此模式。
总而言之,我认为您看到的是预期的行为,因为在这种情况下,您的数据存储区不会产生无限的流来通知您添加到集合中的新元素,而是在该集合中存在的有限元素流给定的时间。