Войти или зарегистрироваться

Помогите completablefuture и синхронизация с главным потоком

Yourbreath

Активный участник
Пользователь
Баллы
61
В бд хранится инвентарь игрока. Нужно при определенном действии удалять оттуда предметы.
Если предметов не хватает, вывести игроку соответствующее сообщение.

Проблема в том, что для работы с бд юзаю completablefuture и когда обращаюсь к таблице и получаю список предметов, проверяю, хватает ли их для этой операции, вернуть какой-то ответ не получется.

Еще сложности добавляет то, что метод, который обращается к бд и всё это там проверяет, находится в плагине А, а мне нужно вернуть ответ в плагин Б (оттуда его и вызываю). И если предметов недостаточно, писать об этом игроку и не выполнять следующий код.

Кто-то, наверное, напишет про колбэки, но либо у меня лыжи не едут либо уже хз. Если я передаю в метод, скажем, ранебл с определенным действием которое нужно выполнять если предметов недостаточно, тогда он сработает, но вот только ответа я все-равно не получу и не смогу в нужном месте плагина Б застопорить код в случае нехватки предметов.

Как выкручиваться из этих костылей?
 
Хранить инвентарь в плагине и не обращаться каждый раз к бд

плагин включился, загрузил игроков и работаешь с ними

при выключение сохраняешь инвентари в бд
 
Просто создай и вызывай событие в плагине А и обрабатывай его в плагине Б
 
Хранить инвентарь в плагине и не обращаться каждый раз к бд

плагин включился, загрузил игроков и работаешь с ними

при выключение сохраняешь инвентари в бд
Не варик. Даже если я буду каждые 5 минут сохранять все данные в бд, есть шанс потери данных, если сервер аварийно завершит свою работу. Мне нужно максимально исключить подобный шанс
 
Не варик. Даже если я буду каждые 5 минут сохранять все данные в бд, есть шанс потери данных, если сервер аварийно завершит свою работу. Мне нужно максимально исключить подобный шанс
В асинсе у тебя еще больше таких потерь и дюпов будет. С инвентарями нельзя работать в отдельном потоке.
 
Звучит неплохо, но я не понимаю, в какой момент нужно вызывать это событие в плагине А ?
После получения ответа из базы. Если нужно работать с инвентарем, то обрабатывать событие надо синхронно (в основном потоке).
Чтобы вызвать синхронный код из асинхронного необходимо запустить синхронный шедулер.
Таким образом получится примерно так:
- Асинхронно отправляется запрос в БД
- Поле получения ответа запускается синхронный шедулер
- Внутри шедулера вызывается событие
- Сторонний плагин обрабатывает событие
 
После получения ответа из базы. Если нужно работать с инвентарем, то обрабатывать событие надо синхронно (в основном потоке).
Чтобы вызвать синхронный код из асинхронного необходимо запустить синхронный шедулер.
Таким образом получится примерно так:
- Асинхронно отправляется запрос в БД
- Поле получения ответа запускается синхронный шедулер
- Внутри шедулера вызывается событие
- Сторонний плагин обрабатывает событие
Многие поправляли меня с асинком в инвентарях, в чём прикол, можешь объяснить?
 
Многие поправляли меня с асинком в инвентарях, в чём прикол, можешь объяснить?
Любую модификацию карты желательно выполнять в основном потоке. И даже манипуляции с инвентарём. Так ты гарантированно будешь знать состояние объектов.
Мало того, некоторые действия сервер просто не даст тебе выполнить (вывалив Exception). Например, асинхронный кик игрок или установку блока.
 
Мало того, некоторые действия сервер просто не даст тебе выполнить (вывалив Exception). Например, асинхронный кик игрок или установку блока.
Ну да, у баккита есть проблема в этом, что он нифига не умеет делать в асинхроне.

А на счёт инвентарей, если никто из игроков не может менять его, то всё равно не особо понимаю
 
Многие поправляли меня с асинком в инвентарях, в чём прикол, можешь объяснить?
Не понял вопроса.
С инвентарями и многими другими механиками нельзя работать в асинкеы. Если ты обратишься в асинке то инвентари будут иметь промежуточное состояние - может так получиться, что часть данных потеряется. Фактически это состояние гонкаэи (race condition).
В связи с этим ядро и запрещает асинхронные операции - бросает исключения при асинхронном доступе.
Сейчас нужно быть уверенным в порядке выполнения обработки данных:
Сначала завершается тик ядра, потом начинается обработка одним плагином, затем другим (и так по цепочке), и после этого уже начинается обработка следующего тика ядра.
Нарушение этого порядка может привести к некорректному состоянию данных или банально ко всяким ConcurrentModificationException
 
А на счёт инвентарей, если никто из игроков не может менять его, то всё равно не особо понимаю
При чтении данных рейс кондишн тоже никто не отменял.

Ну да, у баккита есть проблема в этом, что он нифига не умеет делать в асинхроне.
По большей части проблема не в самом бакките как таковом. Можно хоть все механики вынести в асинхрон, но есть две огромные проблемы:
1) Это вполне вероятно полностью или частично сломает плагины, написанные под более старые версии
2) Написание новых плагинов потребует от разработчиков значительно более серьезных навыков программирования. Если и будет вам, то будет оно более сложным для работы, чем текущее. Опять же, чтобы нигде не сломать состояние данных
 
При чтении данных рейс кондишн тоже никто не отменял.


По большей части проблема не в самом бакките как таковом. Можно хоть все механики вынести в асинхрон, но есть две огромные проблемы:
1) Это вполне вероятно полностью или частично сломает плагины, написанные под более старые версии
2) Написание новых плагинов потребует от разработчиков значительно более серьезных навыков программирования. Если и будет вам, то будет оно более сложным для работы, чем текущее. Опять же, чтобы нигде не сломать состояние данных
Спасибо, теперь, однако, более понятно
 
Назад
Верх