Служба таймера: у бина нет таймеров в EJB3.1 - PullRequest
0 голосов
/ 23 апреля 2019

На самом деле, я перенес приложение с EJB2.1 на EJB3.1. После изменения приложения у меня возникла проблема при вызове метода getTimers().

Я использую сервер Websphere.

Вот мой код:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class TimedRequestBean implements TimedRequestLocal {    
    @Resource
    private SessionContext sessionContext;
    public void cancelTimers() {
            TimerService ts = this.sessionContext.getTimerService();
            Collection timers = ts.getTimers();
            Iterator it = timers.iterator();
            while (it.hasNext()) {
                Timer myTimer = (Timer)it.next();
                myTimer.cancel();
            }
       }
}

Вход:

javax.ejb.EJBException: см. Вложенное исключение; Вложенное исключение: java.lang.IllegalStateException: служба таймера: бин не имеет таймеры: BeanId (LeadDeliverySystemEAR # timedrequest.jar # TimedRequestBean, null) java.lang.IllegalStateException: служба таймера: бин не имеет таймеры: BeanId (LeadDeliverySystemEAR # timedrequest.jar # TimedRequestBean, null) на com.ibm.ejs.container.BeanO.getTimers (BeanO.java:1733) на com.ford.it.request.async.TimedRequestBean.cancelTimers (TimedRequestBean.java:460)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Наконец-то я получил решение. Я реализовал интерфейс TimedObject в своем бине. Он работает нормально. Вот мой код.

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class TimedRequestBean implements TimedRequestLocal, TimedObject {    
    @Resource
    private SessionContext sessionContext;
    public void cancelTimers() {
            TimerService ts = this.sessionContext.getTimerService();
            Collection timers = ts.getTimers();
            Iterator it = timers.iterator();
            while (it.hasNext()) {
                Timer myTimer = (Timer)it.next();
                myTimer.cancel();
            }
       }
}

Источник: http://itdoc.hitachi.co.jp/manuals/3020/30203Y0610e/EY060069.HTM Я думаю, что это будет полезно для других.

0 голосов
/ 23 апреля 2019

TimerService.getTimers() выдает исключение IllegalStateException, если боб не был объявлен с таймерами. Чтобы избежать этого, компонент должен использовать либо @Scheulde, чтобы объявить автоматический таймер, либо @Timeout, чтобы объявить метод обратного вызова тайм-аута для программных таймеров (или XML-эквивалент любой аннотации).

По сути, TimerService недоступен для bean-компонентов, которые не могут иметь таймеры. Так как нет метода @Timeout, ни один из методов создания не может быть вызван на TimerService; аналогично, поскольку для компонента не могут существовать таймеры, вызов getTimers() также не разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...