Size: a a a

2020 December 29

A

Alexander in learn.java
> Под сокетами что ты имеешь ввиду? Держать постоянное соединение?
Да.

>Так как игра с одновременными ходами двух игроков
Так в том то и дело, что не одновременными ходами. Как камень, ножницы, бумага проходит? Дается 10 секунд (условно) на выбор символа. Когда ты сделал выбор, ты обновил информацию (race condition предусмотреть, чтобы данные не потерять). Как прошло время, дай мне результат игры.
источник

A

Alexander in learn.java
Логично?
источник

DK

Dmtr Klkv in learn.java
Одновременной я называю ситуацию, когда любой из игроков может первым прислать ход. То есть не как в шахматах, второй не ждет первого, он ждет конца таймера. Да.
источник

DK

Dmtr Klkv in learn.java
Так вот, у меня есть мэп или там лист ходов, которые нужно проверить и вернуть кто победил. Вот этот проверятель, это что? Разве не в бесконечном цикле нужно постоянно смотреть не пустая ли мапа и если не пустая, то проверять. Похоже на какой-то паттерн, который я не знаю.
источник

V

Vadim in learn.java
Ребят, конкретного ответа не нашел в инете. Как все таки лучше хранить строковые константы, когда их много? Отдельным классом ?
источник

ch

central hardware in learn.java
Vadim
Ребят, конкретного ответа не нашел в инете. Как все таки лучше хранить строковые константы, когда их много? Отдельным классом ?
как удобно, если они из одного класса используются то в нем, если много где то в отдельном
источник

V

Vadim in learn.java
Окей, пасиб
источник

A

Alexander in learn.java
Dmtr Klkv
Так вот, у меня есть мэп или там лист ходов, которые нужно проверить и вернуть кто победил. Вот этот проверятель, это что? Разве не в бесконечном цикле нужно постоянно смотреть не пустая ли мапа и если не пустая, то проверять. Похоже на какой-то паттерн, который я не знаю.
Скажи что ты проверяешь))
Логика на фронте - вступил в игру, отправил свой вариант. Далее, начинаю раз в какое-то время спрашивать о результате, если его нет (а его нет, если второй игрок не дал ответ), вернётся ошибка и опрашиваешь повторно бэк до результата. Тут будет твой "цикл", только вероятнее это будет onSuccess и onFail
источник

A

Alexander in learn.java
И это будет Observer
источник

DK

Dmtr Klkv in learn.java
Alexander
Скажи что ты проверяешь))
Логика на фронте - вступил в игру, отправил свой вариант. Далее, начинаю раз в какое-то время спрашивать о результате, если его нет (а его нет, если второй игрок не дал ответ), вернётся ошибка и опрашиваешь повторно бэк до результата. Тут будет твой "цикл", только вероятнее это будет onSuccess и onFail
Я только сейчас понял, что не сказал, что игра идет до двух побед, это важно 🤣.

В это время на бэке:
Создается объект Игра и объект Ход. Объект Игра содержит ссылки на игроков, флаг играИдет, время начала игры, пустое время конца игры и лист Ходов содержащий первый ход. Ход содержит айди игры, время окончания хода и пустые фигуры игроков.

Ходы кладутся в лист и отдельный поток проверяет, не закончились ли они, сравнивая время конца хода и LocalDateTime.now(). Если закончились, проверяется не закончилась ли игра. Если закончилась то посылаю один результат, если нет создаю новый ход и посылаю другой результат.

Игрок 1 прислал свою фигуру. Я проверяю на достоверность всю инфу, не закончился ли ход и добавляю эту инфу в текущий ход игры (последний в листе в объекте Игра).

Что-то типа такого...
источник

A

Alexander in learn.java
Да хоть до 5...
Ты суть услышь и даже время хранить не надо будет
источник

DK

Dmtr Klkv in learn.java
Alexander
Да хоть до 5...
Ты суть услышь и даже время хранить не надо будет
Погоди, ты говоришь, что фронт дергает бек и спрашивает, есть ли результат. Это я понял. Это так и должно быть. Но бэк в этот момент тоже должен проверять, есть ли результат и если его нет через определенное время, подставлять результат сам. Разве нет?
источник

A

Alexander in learn.java
Dmtr Klkv
Погоди, ты говоришь, что фронт дергает бек и спрашивает, есть ли результат. Это я понял. Это так и должно быть. Но бэк в этот момент тоже должен проверять, есть ли результат и если его нет через определенное время, подставлять результат сам. Разве нет?
Давай отвечу так.
Если тебе хочется, чтобы фронт получал уже готовый результат, сделай scheduler, который будет тебе рассчитывать исход.
В целом, тебе необязательно считать этот исход на бэкенд, потому что ты его можешь рассчитать, когда а) обратился игрок за результатом б) условие - 2 игрока дали ответ.
К этому я и веду
источник

М

Максим in learn.java
Зачем нужны асинхронные http клиенты, еслн можно просто ожидать ответа синхронных в отдельном потоке?
источник

A

Alexander in learn.java
Максим
Зачем нужны асинхронные http клиенты, еслн можно просто ожидать ответа синхронных в отдельном потоке?
Можно конкретную реализацию?
Просто если ты сделаешь синхронный запрос, то ты отвалишься когда-то по тайм-ауту, а твой поток будет продолжать выполнять уже никому не работу
источник

М

Максим in learn.java
Alexander
Можно конкретную реализацию?
Просто если ты сделаешь синхронный запрос, то ты отвалишься когда-то по тайм-ауту, а твой поток будет продолжать выполнять уже никому не работу
CompletableFuture.supplyAsync(()
и через синхронный restTemplate делаю запрос и жду ответ
источник

DK

Dmtr Klkv in learn.java
Alexander
Давай отвечу так.
Если тебе хочется, чтобы фронт получал уже готовый результат, сделай scheduler, который будет тебе рассчитывать исход.
В целом, тебе необязательно считать этот исход на бэкенд, потому что ты его можешь рассчитать, когда а) обратился игрок за результатом б) условие - 2 игрока дали ответ.
К этому я и веду
Вроде понял, спасибо. Последний вопрос, scheduler сейчас как модно организовывать? scheduledThreadPoolExecutor, java.util.Timer или на сайте спринга рекомендуют библиотеку awaitility?
источник

A

Alexander in learn.java
Dmtr Klkv
Вроде понял, спасибо. Последний вопрос, scheduler сейчас как модно организовывать? scheduledThreadPoolExecutor, java.util.Timer или на сайте спринга рекомендуют библиотеку awaitility?
Чем проще, тем лучше. Аннотация есть такая у спринга scheduler. Просто настрой cron и проверяй мапу с играми.
источник

A

Alexander in learn.java
Максим
CompletableFuture.supplyAsync(()
и через синхронный restTemplate делаю запрос и жду ответ
Так у тебя соединение с другим backend (или куда ты делаешь запрос) будет синхронным. Если у тебя timeout стоит по умолчанию, то через 30 секунд, при забитом количестве connections, твой CompletableFuture получит exceptionally
источник

М

Максим in learn.java
Alexander
Так у тебя соединение с другим backend (или куда ты делаешь запрос) будет синхронным. Если у тебя timeout стоит по умолчанию, то через 30 секунд, при забитом количестве connections, твой CompletableFuture получит exceptionally
А что значит при забитом количестве коннекшинов?
Я думал у resttemplate нет пула коннекшинов и при каждом вызове открывается новый коннекшин
источник