2015-04-14 2 views
0

В одной руке у меня есть класс CronScheduler, который должен запускаться один раз для каждого приложения и настраивать TimerService.
С другой стороны, у меня тяжелая задача (аннотированная как @EJB), которую я хочу вызвать в @timeout таймера. Обратите внимание, что в таймере, я создаю поток, который вызывает p.go()TimerService EJB инициализируется несколько раз

Код:

@Singleton 
@Startup 
public class CronScheduler { 

    @EJB 
    Processor p; 

    @Resource 
    private TimerService timerService; 

    @PostConstruct 
    public void init() { 
     String h = ... // h,m ,s work fine 
     String m = ... 
     String s = ... 
     ScheduleExpression conf = new ScheduleExpression(); 
     conf.hour(h); 
     conf.minute(m); 
     conf.second(s); 
     // I've tried with the second param (TimerConfig) enabled and disabled 
     timerService.createCalendarTimer(conf, new TimerConfig("msg ", false)); 
     LOG.log(Level.INFO, ">> Ready for: " + conf.toString()); 
    } 

    @Timeout 
    public void run() { 
    LOG.log(Level.INFO, "Calling the process"); 
    Thread t = new Thread() { 
     @Override 
     public void run() { 
     super.run(); 
     p.go(); 
     } 
    }; 
    t.start(); 
    } 

} 

Дело в том, хрон является инициализировать несколько раз. Код @PostConstruct работает N раз. В журналах я вижу.

Ready for: A-B-C 
Ready for: A-B-C 
Ready for: A-B-C 

Последствия p.go() вызывается несколько раз. Работает ли аннотация @singleton?

+1

Возможно, связанных с: http://stackoverflow.com/questions/9077966/postconstruct-method-called-twice-for-the-same-request и http://stackoverflow.com/questions/16796320/cdi -bean-конструктор-и-postconstruct называемого многодисковые раз – assylias

ответ

0

Возможно, у вас работает более одного таймера? Недавно я столкнулся с странным сценарием, где таймер был установлен в 1k ms, а новый - до предыдущего. Добавление какой-то блокировки зафиксировало это для меня. Возможно, это аналогичный случай.

Вы можете отлаживать и проверять, сколько потоков у вас есть.

0

Наконец-то я получил; это вопрос EJB и ручных потоков. Дело не в самом таймере, а в создании нового потока, который не обрабатывается магией EJB.

@Singleton 
@Startup 
public class CronScheduler { 

    @EJB 
    Processor p; 

    @Resource 
    private TimerService timerService; 

    @PostConstruct 
    public void init() { 
     String h = ... // h,m ,s work fine 
     String m = ... 
     String s = ... 
     ScheduleExpression conf = new ScheduleExpression(); 
     conf.hour(h); 
     conf.minute(m); 
     conf.second(s); 
     timerService.createCalendarTimer(conf, new TimerConfig("desc msg ", false)); 
     LOG.log(Level.INFO, ">> Ready for: " + conf.toString()); 
    } 


    @Timeout 
    public void run() { 
    LOG.log(Level.INFO, "Calling the process"); 
    p.go(); 
    } 
} 
Смежные вопросы