Планировщик Java Spring работает несколько раз в продукте

I am running a web application scheduler of spring(cron) for sending notification mail, when running on local server its running fine but on production mode its sending multiple mails.

<bean id = "EmailNotificationScheduledTask" class = "com.prism.utils.EmailNotificationTask" />
<task:scheduled-tasks scheduler = "scheduler">
    <task:scheduled ref = "EmailNotificationScheduledTask" method = "run" cron = "0 0 10 * * MON"/> 
</task:scheduled-tasks>
<task:scheduler id = "scheduler" pool-size = "1"/>

public class EmailNotificationTask extends TimerTask{
@Override
public void run() {
        synchronized (this) {
            sendPropertyNotificationEmail();
        }
    //}
}

@SuppressWarnings("unchecked")
public void sendPropertyNotificationEmail(){
    try{
        //Mail sending logic
        }

    } catch (DAOException ee) {
        _logger.error("Error while sending notification messages", ee);
    }
}

}

Есть ли в вашем коде аннотации?

hisener 21.03.2018 10:30

@hisener вызывается не просто метод sendPropertyNotificationEmail, который содержит функцию отправки почты.

Anuj Victor 21.03.2018 10:46

Ожидается ли, что sendPropertyNotificationEmail () будет отправлять одно письмо за один вызов? Когда вы говорите «отправка нескольких писем», вы имеете в виду, что каким-то образом sendPropertyNotificationEmail () вызывается в нескольких потоках? Пожалуйста, поясните подробнее проблему.

Rahul 21.03.2018 11:10

@Rahul, да, я думаю, он запускается в нескольких потоках. Да, функция реализована для отправки одного письма каждый понедельник в 10 часов утра, при локальном тестировании он работает нормально, отправляется только одно письмо, но при развертывании в производственном режиме отправляется несколько писем.

Anuj Victor 21.03.2018 11:13

@Rahul, hisener, пожалуйста, найдите исходный код в вопросе, который я отредактировал снова. Собственно в исходном коде метод run вызывается.

Anuj Victor 21.03.2018 11:19

Я думаю, вам не нужно переопределять метод запуска. Spring справляется с этим. Пожалуйста, обратитесь к spring.io/guides/gs/scheduling-tasks

hisener 21.03.2018 11:36

@hisener в порядке, но все равно ведет себя так же.

Anuj Victor 21.03.2018 11:50

@hisener, а также как вы можете сказать, что метод run создает проблему? пожалуйста, объясни.

Anuj Victor 21.03.2018 11:56

Думал как-то запустить метод, как и sendPropertyNotificationEmail. Я не совсем понимаю, в чем проблема. Мне нужно попробовать, но я сейчас недоступен, извините.

hisener 21.03.2018 12:56

В производстве работает более одного сервера?

shankulk 27.10.2018 06:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
814
1

Ответы 1

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

Другие вопросы по теме