当前位置: 首页 > 面试题库 >

避免在玻璃鱼上擦掉计时器

蒋波光
2023-03-14
问题内容

我有一个用@Schedule注释的方法,该方法有时会被容器调用。

@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void myTimerMethod() throws Exception {
    ...
}

问题是在某些情况下,我希望此方法引发异常以导致正在进行的事务回滚。但是,如果我执行两次以上,计时器将被删除,不再调用!

INFO: EJB5119:Expunging timer ['68@@1359143163781@@server@@domain1' 'TimedObject = MyBean' 'Application = My-War' 'BEING_DELIVERED' 'PERIODIC' 'Container ID = 89072805830524936' 'Fri Jan 25 21:49:30 CET 2013' '0' '*/5 # * # * # * # * # * # * # null # null # null # true # myTimerMethod # 0' ] after [2] failed deliveries

我知道我可以使用配置在domain.xml中重新安排计时器

<domains>
    ...
    <configs>
        <config>
            ...
            <ejb-container session-store="${com.sun.aas.instanceRoot}/session-store">
               <ejb-timer-service>
                     <property name="reschedule-failed-timer" value="true"></property>
                </ejb-timer-service>
            </ejb-container>
            ...
        </config>
    </configs>
    ...
</domains>

但是我的问题是,在部署应用程序时可以配置此设置吗?

在以下位置找不到它:

glassfish-resources.xml
glassfish-ejb-jar.xml
glassfish-web.xml

是否可以通过编程方式进行某些操作?

(我将这样的服务器配置放在配置文件中而不是配置服务器的背后原因是,这样我的应用程序应该可以直接安装在全新安装的glassfish上)


问题答案:

我会使用另一种方法。

与其直接从调度的方法中引发异常,不如尝试引入一种间接级别,如下所示:

...
@Inject RealWorkHere realImplementation;

@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void myTimerMethod(){
  try{
     realImplementation.myTimerMethodImpl()
  }catch (Exception x){
   // hopefully log it somewhere
  }
}
...

RealWorkHere实际实现的bean 在哪里,如:

@Stateless
public class RealWorkHere{
   @TransactionAttribute(REQUIRES_NEW)
   public void myTimerMethod() throws Exception {

   }
}

它具有以下优点:

  • 在容器初始化的事务中不引发异常(从而避免删除)
  • 更好地记录异常
  • 明确划分“真实”业务交易

也可以看看

  • ejb-spec#111:如果在执行计时器回调方法期间引发了应用程序异常,请清除容器的行为


 类似资料:
  • 我已经完成了在glassfish v4中添加SSL证书的步骤。我已经通过浏览器和java swing客户端验证了它的有效性(我在客户端使用apache的http客户端库) 什么不工作是管理控制台!由于成功导入SSL,我不能再连接到管理控制台,http://www.myhost.com:4848,我仍然得到登录屏幕,总是工作的管理员用户名/密码组合已停止工作。我也注意到当尝试部署一个网络应用程序从n

  • 问题内容: 我正在下载Java EE,似乎有许多不同的下载选项。我不确定应该选择哪一个。Java EE似乎与GlassFish打包在一起。谁能告诉我这是什么,它对我有什么好处? 其次,如果我只是想玩转并了解Java EE,那么对我来说下载的是什么?列出选项的链接在下面… Java EE下载选项 问题答案: 首先,将近五年前它被称为Java EE。首字母缩略词J2EE仍指5.0之前的旧Java EE

  • 我将mysql驱动程序放入glassfish/admin1/lib,我在尝试与GlassFish 3.1.2建立连接时收到此错误 为SimpleCRUD_ConnectionPool Ping连接池失败。类名错误或未为:com设置类路径。mysql。jdbc。jdbc2。可选择的MysqlDataSource请检查服务器。记录更多细节。 野兔配置: 池名称:SimpleCRUD_Connectio

  • 这是我在尝试更改主密码时看到的。。。我尝试了几乎所有字符、数字、特殊字符的组合/home/larry$/home/glassfish/bin/asadmin更改主密码--savemasterpassword=true输入当前主密码

  • 我试图在Netbeans中运行一个非常基本的servlet ContextListener程序。我已经很好地编码了它,但是在最后时刻,当我试图执行它的时候,程序的输出标签给了我如下所示的错误.. 这是我的ContextListener.java档案 这是网络.xml Netbeans没有显示任何语法错误。servlet文件是Netbeans IDE生成的默认文件。令人困惑的是…当我试图在没有侦听器

  • 我想在Glassfish中使用Jenkins的这些批处理命令部署一个WAR。: