Я придумал этот алгоритм для перетасовки случайных пользователей другим пользователям. (для секретной игры Санты) Но когда я запускаю асинхронный процесс для перетасовки в данное время, он останавливается 5-м пользователем. Есть идеи почему?
Мой сервис для алгоритма и его запуска:
public class GitfteeServiceImpl implements GifteeService{
@Autowired
private UserRepository userRepository;
private final ScheduledExecutorService shufflingScheduler = Executors.newSingleThreadScheduledExecutor();
@Override
public void setGifteeToAll() {
List<User> users = userRepository.findAll();
List<User> usersGiftees = userRepository.findAll();
List<Long> userIds = usersGiftees.stream().map(User::getUserId).collect(Collectors.toList());
log.info(users.toString());
for(User u : users){
User giftee = getGifteeForOne(u, usersGiftees,userIds);
userIds.remove(giftee.getUserId());
usersGiftees.remove(giftee);
}
}
private User getGifteeForOne(User user, List<User> users, List<Long> ids) {
Long randomId = getRandomId(ids);
User giftee = userRepository.findByUserId(randomId);
while (giftee == null || !users.contains(giftee) || Objects.equals(user.getUserId(), randomId)){
randomId = getRandomId(ids);
giftee = userRepository.findByUserId(randomId);
}
user.setGiftee(giftee);
userRepository.save(user);
return giftee;
}
private Long getRandomId(List<Long> ids) {
Collections.shuffle(ids);
return ids.get(0);
}
@Override
public void scheduleShuffling(LocalDateTime gameDuration) {
Runnable scheduleShufflingTask = this::setGifteeToAll;
Duration duration = Duration.between(LocalDateTime.now(), gameDuration);
shufflingScheduler.schedule(scheduleShufflingTask, duration.getSeconds(), TimeUnit.SECONDS);
}
}
Это мой контроллер:
public class AdminController {
@Autowired
GifteeService gifteeService;
@PostMapping("/start_date")
public void hi(@RequestBody LocalDateTime localDateTime) {
LocalDateTime aDateTime = LocalDateTime.of(2019, Month.JANUARY, 17, 22, 39, 50);
gifteeService.scheduleShuffling(aDateTime);
}