3

所以我在 Glassfish 3.1 上运行 Java EAR 应用程序。我在我的 EJB 模块中创建了一个带有单个注释计时器函数的无状态会话 bean。我没有确切的代码,但它看起来像这样:

@Stateless
public class SessionTimerBean {

    public SessionTimerBean(){
       System.out.println("Constructor Called");
    }

    @Schedule(second="*/10", minute="*", hour="*")
    public void scheduleTimer(final Timer t) {
       System.out.println("Timer Called");
    }
}

当我启动 Glassfish 时,调试信息似乎表明它可以识别 EJB 计时器注释,并且 bean 的构造函数方法确实在启动时被调用。但是计时器方法本身似乎永远不会在任何时候被触发。

其他人遇到过这个问题吗?我还缺少其他配置吗?

提前致谢。

4

3 回答 3

4

下面的计时器代码适用于 glassfish 3.1.2

import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.Timer;

@Stateless
public class LabbBean {

    @Schedule(second="*/5", minute="*",hour="*", persistent=false)
    public void method123(final Timer timer) {
        System.out.println("Timer1234");
    }
}

但是当我删除时停止工作

persistent=false 

所以在服务器日志中我发现:

INFO: keepstate is true and will not create new auto timers during deployment.

所以我将“保持状态”更改为假。我不是它的专家,但是将其更改为 false 会使计时器在没有 persistent=false 的情况下工作

我在下面的文件中更改了它

glassfish-ejb.xml:

<glassfish-ejb-jar>
    <enterprise-beans>
    ...
    </enterprise-beans>
    <keep-state>false</keep-state>
</glassfish-ejb-jar>

glassfish-application.xml

<glassfish-application>
    <keep-state>false</keep-state>
</glassfish-application>
于 2012-10-27T18:13:49.873 回答
4

根据规范,定时器按照惯例是持久的:

计时器服务旨在为长期业务流程建模。计时器在容器崩溃、服务器关闭以及向它们注册的企业 bean 的激活/钝化和加载/存储周期中幸存下来。可以选择在每个计时器的基础上禁用这些持久性保证。

Aksel 演示了如何禁用持久保证。glassfish 服务器使用它的默认数据库来保存它的计时器(看这里)。我可以想象它没有启动并运行,因此计时器不起作用。使用以下命令启动它:

asadmin start-database
于 2012-11-07T14:23:13.443 回答
2

我在学习教程时遇到了同样的问题。我使用的是 Glassfish 4.1(JavaEE 7 实现)。我遇到了同样的错误

信息:此服务器不拥有 EJB 计时器

我刚刚创建了一个动态 Web 模块。不是带有 EJB 模块的 EAR 项目。按照上述答案,我首先通过persistent=false像这样插入属性来更改我的 @Schedule() 注释

@Schedule(second=" /10", minute=" ", hour="8-23", dayOfWeek="Mon-Fri", dayOfMonth=" ", month=" ", year="*", info="我的计时器”,持久=假)

然后我转到我的 glasshish-web.xml 部署描述符,并将以下配置<keep-state>false</keep-state>放在该部分中,如下所示:

<glassfish-web-app>
    <context-root>/HelloWorld</context-root>
    **<keep-state>false</keep-state>**
</glassfish-web-app>
于 2015-12-18T14:53:18.973 回答