6

任何人都知道如何使 @Schedule 注释在 JBoss AS 7 上工作?

我知道在 Glassfish-3.1.2 上它可以开箱即用。

我试试这个:

@ManagedBean
@Stateless(name="ImportStatementSchedule")
public class ImportStatementSchedule implements Serializable{
private Logger _log = Logger.getLogger(this.getClass());

    @Schedule(minute="*")
    public void executeImport(){
        _log.info("Scheduled task started");
    }

}

我希望每分钟都会收到日志消息,但什么也没有;)

我检查了这些论坛主题,但没有任何帮助:

https://community.jboss.org/message/623574

https://community.jboss.org/message/621893

https://community.jboss.org/message/637567

A 拥有 JBoss AS 7.1.1-Final

也许我忘记了什么,请任何人指出我正确的方式?

更新:

我知道 JBoss 将我的 EJB 注册到 JNDI :

11:07:05,548 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-6) JNDI bindings for session bean named ImportStatementSchedule in deployment unit deployment "finadv.war" are as follows:

    java:global/finadv/ImportStatementSchedule!finadv.bean.ImportStatementSchedule
    java:app/finadv/ImportStatementSchedule!finadv.bean.ImportStatementSchedule
    java:module/ImportStatementSchedule!finadv.bean.ImportStatementSchedule
    java:global/finadv/ImportStatementSchedule
    java:app/finadv/ImportStatementSchedule
    java:module/ImportStatementSchedule

更新2

如评论中所述已解决

4

3 回答 3

6

定时器服务是 EJB 服务。ImportStatementSchedule应该是一个@Stateless@Singleton会话 bean。从 EJB 3.1 规范,第 18.2 节:

对于自动创建的定时器,timeout 方法可以是带有 Schedule 注解的方法。可以为无状态会话 bean、单例会话 bean、消息驱动 bean 和 2.1 实体 bean 创建计时器。不能为有状态会话 bean 创建计时器。

INFO日志语句具有误导性。JBoss 不注册 EJB。@ManagedBean它只是使用注释(Javadoc)定义的相同命名方案:

[..] 托管 Bean 名称在 Java EE 模块中必须是唯一的。对于每个命名的托管 Bean,Java EE 容器必须使用与 EJB 组件相同的命名方案,在 JNDI 中提供以下条目。在应用程序命名空间中:

java:app/<module-name>/<bean-name>

在包含托管 Bean 的模块的模块命名空间中:

java:module/<bean-name>

于 2012-05-01T11:04:50.390 回答
4

我可以补充一下,如果你写

@Schedule(minute="*")

它只会在午夜触发。因为小时参数是默认值:0

尝试: 或类似的东西。就我而言,它有所帮助。 @Schedule(minute = "/1", hour = "")

于 2012-07-24T14:47:58.447 回答
0

您必须指定hours,尝试:

@Schedule(hour="\*", minute="\*")
于 2016-02-18T17:03:41.553 回答