2017-11-07 44 views
0

@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

+0

これはビルドやパッケージの問題のような臭いです... –

答えて

0

と基本的に同じではありませんNightlyWorkSuspensionEmailSender postConstruct方法の仕事、。これは悪いことではありませんが、異なるJNDI名が必要な場合や、コンテナを混乱させる場合があります。おそらく最初のEJBだけが開始されます。

SchedulableServiceの特化を各セッションBeanに作成してみてください。

+0

私は7つの夜間のプロセスがSchedulableServiceを拡張しています。それらのうち5つは初期化中に実行されます(2つは上記のようにinitではありません)。しかし、ランダムには実行しない2つの特殊化を作成しようとします。提案していただきありがとうございます、私はこの古いプロジェクトに悩まされており、これを解決する方法を理解することはできません – DarkFeud

関連する問題