Без кода, объясняющего, как вы создали свой класс, трудно ответить. Из того, что я понимаю, вы хотите запустить процесс только один раз.
Вероятно, лучший подход - использовать Запланированное задание . Это запустит процесс в определенное время, и Play гарантирует, что одновременно будет запущен только 1 экземпляр этого процесса, даже если в расписании будет указан другой экземпляр. Допустим, у вас есть процесс, запланированный на каждый час, и процесс занимает 3 часа. Первоначальный процесс будет единственным, выполняющимся в течение 3 часов, пока он не завершится.
Теперь я бы предположил, что вы хотите, чтобы ваш процесс повторялся при генерации отчетов. Если нет, то если вы хотите запустить его только один раз, вы можете вместо этого использовать асинхронное задание начальной загрузки . Это будет выполнено только один раз, в начале приложения.
РЕДАКТИРОВАТЬ при обновлении: во время разработки @OnApplicationStart может выполняться несколько раз, поскольку Play может автоматически перезагружать приложение при внесении определенных изменений кода. Это часть процесса разработки (то же самое, что задание @OnApplicationStart не запустится в Dev, пока сервер не получит запрос).
Поскольку это задание, которое вы хотите выполнить только один раз, вы можете попробовать пропустить его в режиме разработки, используя проверку:
if (Play.mode == Play.Mode.DEV)
Если вам нужно запустить его хотя бы один раз, добавьте URL-адрес только для разработчиков, к которому вы можете обратиться во время разработки, для запуска процесса.
Теперь, в вашем обновлении вы также упоминаете, что вызываете этот код в контроллере и что каждый раз, когда к контроллеру обращаются, вызывается метод. Это ожидается. Синглтон не означает, что он будет работать только один раз, но в системе всего 1 объект. Если в вашем контроллере вы запускаете вычисления, это будет происходить каждый раз, когда вы обращаетесь к контроллеру.
ВТОРОЕ РЕДАКТИРОВАНИЕ (в комментариях): Арасу, другая проблема заключается в том, что вы вызываете метод load () при создании объекта. Синглтон не гарантирует, что объект будет построен только один раз. Это гарантирует, что после постройки будет существовать только 1 объект. Но может случиться так, что объект удаляется GC, в этом случае в соответствии с вашим кодом, если вы создадите его снова, тогда вы вызовете load () и повторите обработку.
Лучшее решение - не вызывать «load» для конструктора, а заставить пользователя (вас) вызывать его после получения экземпляра. Альтернативой является установка какого-либо флага в начале загрузки, который определяет, был ли выполнен код. Помните, что Play не имеет состояния, поэтому этот флаг нужно будет сохранить в базе данных.