【问题标题】:EJB Timer : put in a method with Exception, the @Timeout annotationEJB Timer:放入一个带有异常的方法,@Timeout 注释
【发布时间】:2014-11-12 10:04:14
【问题描述】:

大家早上好,
我给你写信是因为我想创建一个 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 {
             .....
             .....
             .....
         }

}


我从 EJB 编程开始:你觉得我的代码好吗?
我有必要保留这个例外。
你遇到过这样的问题吗?
非常感谢。

【问题讨论】:

  • 在@Timeout注解的方法updateDataBase中,
  • 在@Timeout 注释方法updateDataBase 中,我可能会插入一个捕获异常的try catch。但如果可能的话,我想找到一种方法来保持这个应用程序异常抛出。因为,通过 try catch,我“删除”了应用程序异常。
  • java 文档指出 Timeout 回调方法不能抛出应用程序异常。但是我想对一个方法使用@Timeout 注释,并且我希望这个方法,如果可能的话,当然,如果可能的话,抛出一个异常。你有什么想法可以调和这两个事实吗?非常感谢。托马斯

标签: java exception timer ejb-3.0


【解决方案1】:

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

【讨论】:

  • bkail,我想标记你的答案,但我不能,因为我的声誉太低了。
  • @Thomas 你接受了答案,这就是你需要做的,谢谢:-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2011-12-10
  • 2013-04-10
相关资源
最近更新 更多