Spring WebFlux를 배우고 있습니다.
내 엔티티는 다음과 같습니다.
@Table("users")
public class User {
@Id
private Integer id;
private String name;
private int age;
private double salary;
}
아래와 같은 리포지토리(H2 데이터베이스를 사용하는 R2)가 있습니다.
public interface UserRepository extends ReactiveCrudRepository<User,Integer> {
}
내 컨트롤러는 다음과 같습니다.
@Autowired
private UserRepository userRepository;
private static List<User> userList = new ArrayList<>();
@PostConstruct
public void initializeStockObjects() {
User stock1 = new User(11, "aaaa", 123, 123);
User stock2 = new User(12, "bbb", 123, 123);
User stock3 = new User(13, "ccc", 123, 123);
userList.add(stock1);
userList.add(stock2);
userList.add(stock3);
}
@RequestMapping(value = "/livelistofusers", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<List<User>> getUsers() {
return getUserData(userList);
}
public Flux<List<User>> getUserData(List<User> userList) {
Flux<Long> interval = Flux.interval(Duration.ofSeconds(3));
interval.subscribe((i) -> userList.forEach(user -> addNewUser(user)));
Flux<List<User>> transactionFlux = Flux.fromStream(Stream.generate(() -> userList));
return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);
}
이 시점까지는 모두 좋습니다. 3초마다 전체 사용자 List을 보기로 반환할 수 있습니다. 여기에는 전혀 문제가 없습니다.
이제 Flue ie Flux flux2 = userRepository.findAll()을 뷰로 보내고 싶습니다. 즉, return getUserData(userList);
내가 어떻게 할 수 return getUserData(flux2(...what should I do here ???... I tried couple of things but I end up making the Blocking list instead of Non-Blocking ...));
있습니까?
질문: 이것을 어떻게 달성할 수 있습니까? 즉, 어떻게 3초마다 전체 Flux를 내 보기로 보낼 수 있습니까? 나는 여기서 길을 잃고 우둔한 느낌이 듭니다. 모든 관련 도움말 링크 또는 솔루션은 크게 감사하겠습니다.
편집하다:
Nipuna의 의견에 따라 나는 이것을 시도했습니다.
@RequestMapping(value = "/livelistofusersall", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<List<User>> getUsersall() {
Flux<Long> interval = Flux.interval(Duration.ofSeconds(3));
interval.subscribe((i) -> userRepository.findAll());
Flux<List<User>> transactionFlux = userRepository.findAll().collectList().flatMapMany(Flux::just);
return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);
}
그러나 이제 내 컨텍스트 경로에서 List이 로드되지만 3초 후에 "한 번만" 로드됩니다. 내가 여기서 무엇을 놓치고 있습니까?