У меня странная проблема с @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