Метод @PostConstruct не запускается во время инициализации

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

Я написал 3 из этих классов. Во время запуска запускается только один из этих классов, метод PostConstruct. Я удалил другие методы в следующих классах, потому что они не имеют значения. ScheduledService содержит только вспомогательные методы.

этот работает и правильно инициализируется сообщением, появляющимся в журнале

package ee.rmit.tor.ejb.timer;

import ee.rmit.tor.domain.enums.SystemParameterType;
import ee.rmit.tor.ejb.search.WorkingSearchService;
import org.slf4j.Logger;

import java.util.Calendar;
import java.util.Date;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.ScheduleExpression;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class NightlyWorkTerminationEmailSender extends SchedulableService {
    private final static String TIMER_ID = "WorkTerminationEmailNotificationServiceTimer";

    /**
     * Default schedule time
     */
    public static final String DEFAULT_SCHEDULE_TIME = "05:00";


    @PersistenceContext
    EntityManager entityManager;

    @Inject
    private Logger logger;

    @Resource
    private TimerService timerService;

    @Inject
    protected WorkingSearchService workingSearchService;


    /**
     * Schedules the timer to run at predetermined time
     */

    @PostConstruct
    public void postConstruct() {
        // get the configuration parameter from DB
        Date notificationTime = getNextExecutionTime(SystemParameterType.EMAIL_TEAVITUS_TOOTAJALE_AEG,
                                                     DEFAULT_SCHEDULE_TIME);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(notificationTime);

        String timeHhMm = calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE);
        // create schedule
        ScheduleExpression schedule = new ScheduleExpression();
        schedule.hour(calendar.get(Calendar.HOUR_OF_DAY)).minute(calendar.get(Calendar.MINUTE));

        timerService.createCalendarTimer(schedule, new TimerConfig(TIMER_ID, false));
        logger.info("Work termination Email notification service has been scheduled to run every day at {}", timeHhMm);
    }

}

Я написал почти такой же класс, но он не запускается при запуске. Я также пытался установить точку останова в этом классе во время запуска, но он не ломается внутри этого класса, и в журналах ничего нет. Может ли кто-нибудь предложить, почему? Я гуглил, но без помощи. Стек во время инициализации чист, и проект "загружается" нормально.

package ee.rmit.tor.ejb.timer;

import ee.rmit.tor.domain.enums.SystemParameterType;
import ee.rmit.tor.ejb.search.WorkingSearchService;
import org.slf4j.Logger;

import java.util.Calendar;
import java.util.Date;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.ScheduleExpression;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class NightlyWorkSuspensionEmailSender extends SchedulableService {
    private final static String TIMER_ID = "WorkSuspensionEmailNotificationServiceTimer";

    /**
     * Default schedule time
     */
    public static final String DEFAULT_SCHEDULE_TIME = "05:00";


    @PersistenceContext
    EntityManager entityManager;

    @Inject
    private Logger logger;

    @Resource
    private TimerService timerService;

    @Inject
    protected WorkingSearchService workingSearchService;


    /**
     * Schedules the timer to run at predetermined time
     */

    @PostConstruct
    public void postConstruct() {
        // get the configuration parameter from DB
        Date notificationTime = getNextExecutionTime(SystemParameterType.EMAIL_TEAVITUS_TOOTAJALE_AEG,
                                                     DEFAULT_SCHEDULE_TIME);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(notificationTime);

        String timeHhMm = calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE);
        // create schedule
        ScheduleExpression schedule = new ScheduleExpression();
        schedule.hour(calendar.get(Calendar.HOUR_OF_DAY)).minute(calendar.get(Calendar.MINUTE));

        timerService.createCalendarTimer(schedule, new TimerConfig(TIMER_ID, false));
        logger.info("Work suspension Email notification service has been scheduled to run every day at {}", timeHhMm);
    }

}

Почему не работает метод postConstruct NightlyWorkSuspensionEmailSender, когда он в основном идентичен NightlyWorkTerminationEmailSender


person DarkFeud    schedule 07.11.2017    source источник
comment
Это пахнет проблемой сборки или упаковки...   -  person Steve C    schedule 09.11.2017


Ответы (1)


У вас есть 2 сеансовых компонента с одинаковым интерфейсом. Это неплохая практика, но вам нужны разные имена JNDI, иначе вы запутаете контейнер. Вероятно, запущен только первый EJB.

Попробуйте создать специализации вашего ScheduableService для каждого сеансового компонента.

person Gilliard Macedo    schedule 09.11.2017
comment
У меня есть 7 ночных процессов, расширяющих ScheduableService. 5 из них запускаются во время инициализации (2 других просто не инициализируются, как указано выше), но я попытаюсь создать специализации для 2 из них, которые случайным образом не запускаются. Спасибо за предложения, я застрял в этом старом проекте и не могу понять, как это решить. - person DarkFeud; 10.11.2017