@PostConstructに関する奇妙な問題があります。バックグラウンドタスクをメモリにロードするために初期化中に実行されるいくつかのクラスがあります。@PostConstructメソッドが初期化中に実行されない
私はこれらのクラスのうち3つを書きました。 PostConstructメソッドの1つだけが起動時に実行されます。 これらのクラスでは他のメソッドを削除しましたが、これは問題ではないためです。 SchedulableServiceはこれだけの作業ヘルパーメソッド
を保持し、ログ
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);
}
}
に登場するメッセージを正しく初期化されて私はほとんど同じクラスを書かれているが、これは起動時に実行されません。私は起動時にもこのクラスにブレークポイントを入れようとしましたが、このクラス内でブレークしたり、ログに何もありません。誰かがなぜ示唆できましたか?私は周りにグーグルではなく、助けなしに。 init中のスタックはクリアされており、プロジェクトはうまく起動します。
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);
}
}
なぜそれはあなたが同じインターフェイスを持つ2つのセッションBeanを持つNightlyWorkTerminationEmailSender
これはビルドやパッケージの問題のような臭いです... –