EJB Timer:放入一个带有Exception的方法,@ Timeout注释

时间:2014-11-12 10:04:15

标签: java exception timer ejb-3.0

大家早上好,
我写信给你是因为我想创建一个EJB计时器。
但我的@Timeout注释方法必须抛出一个应用程序异常。
我在文档中看到@Timeout方法不能抛出应用程序异常。

   @Stateless@Local
   @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
   public class AccesCacheImpl implements AccesCache {

        @Resource
        private TimerService serviceMinuteur;

       // i have to make an updateDataBase every 30 minutes
        public void creerTimer() {
          serviceMinuteur.createTimer(1000, 1800000, "MinuteurCache");
        }

        public void detruireTimer() {
            Timer timerCourant;
            for (final Object timer : serviceMinuteur.getTimers()) {
                timerCourant = (Timer) timer;
                if ("MinuteurCache".equals(timer)) {
                 timerCourant.cancel();
             }
        }
       }

         @Timeout
         public void updateDataBase(final Timer pTimer) throws AccesNomenclatureException {
             .....
             .....
             .....
         }

}

@Stateless@Local @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class AccesCacheImpl implements AccesCache { @Resource private TimerService serviceMinuteur; // i have to make an updateDataBase every 30 minutes public void creerTimer() { serviceMinuteur.createTimer(1000, 1800000, "MinuteurCache"); } public void detruireTimer() { Timer timerCourant; for (final Object timer : serviceMinuteur.getTimers()) { timerCourant = (Timer) timer; if ("MinuteurCache".equals(timer)) { timerCourant.cancel(); } } } @Timeout public void updateDataBase(final Timer pTimer) throws AccesNomenclatureException { ..... ..... ..... } } 我从EJB编程开始:你觉得我的代码好吗?
我有必要保持这个例外。
你遇到过这样的问题吗?
非常感谢你。

1 个答案:

答案 0 :(得分:1)

应用程序异常旨在向调用者传达其他信息。在这种情况下,@Timeout方法的调用者是EJB容器,它无法知道应用程序异常的意图,因此不允许这样做。如果您需要向容器发出故障信号以便它重试,我建议捕获AccesNomenclatureException并将其重新抛出为EJBException,这是系统异常而不是应用程序异常。否则,如果您只是想忽略失败,那么抓住它并记录它而不是重新抛出它。