Spring Scheduler неправильно увеличивает значения - PullRequest
0 голосов
/ 10 апреля 2020

Я использую планировщик пружины. Я вызываю m1 () каждые 5 секунд. Почему значение переменной count увеличивается с каждым вызовом? Я ожидаю, что каждый вызов m1 () не зависит от предыдущего. Поэтому при каждом вызове m1 я должен получить значение count равным 1

Как я могу получить значение count = 1 в каждом вызове?

  @Component
    @EnableScheduling
    public class MySchedulers {

        @Autowired
        private DaoService daoService;

        @Scheduled(cron = "*/5 * * * * ?")
        public void process() {
            daoService.serviceMethod();

        }

@Repository
public class DbDao {

    private int count = 0;

    @Value("${test}")
    private String str;

    public void m1() {

        System.out.println(" in dao layer --" + ++count);

    }

Это O / P, который я получаю.

in dao layer --0
 in dao layer --1
 in dao layer --2
 in dao layer --3
 in dao layer --4

1 Ответ

1 голос
/ 10 апреля 2020

Почему значение переменной count увеличивается с каждым вызовом?

Я полагаю, что оно увеличивается, потому что DbDao определено как singleton, что означает, что spring поддерживает один объект введите DbDao в контексте приложения, и этот объект будет вставлен (автоматически подключен) в MySchedulers.

В методе m1 DbDao вы всегда увеличиваете поле данных count (++count) так правильно, что он будет увеличиваться при каждом вызове - это ожидаемое поведение.

Как я могу получить значение count = 1 в каждом вызове?

Ну, это зависит от того, что вы действительно хотите сделать. Например, не используйте count в качестве поля данных, но оно действительно зависит от логики c в вашем сценарии.

Я мог бы сказать, что вы можете использовать область действия прототипа для DbDao - но это на самом деле не имеет смысла, потому что репозитории обычно определяются как одиночные (я не вижу причины создавать новый объект репозитория при каждом вызове к этому).

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

Обновление 1

На основании комментария OP:

Когда по умолчанию используется планировщик, пружина выделяет только 1 поток (размер пула = 1), поэтому , не будет никаких проблем, связанных с потоками, так как все вызовы будут выполняться в одном потоке. Это верно, конечно, до тех пор, пока код, который вы вызываете из «планировщика», не вызывается одновременно другими потоками (например, из контроллера остатка, слушателей сообщений и т. Д.).

Вы можете настроить размер пула, хотя и тогда возможно, что два потока, принадлежащие планировщику, будут вызывать один и тот же метод (например, один из MyDao).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...