设置/配置 EJB 计时器服务的数据源。

14

我正在尝试在我的应用程序中使用EJB 3.1中的计时器服务。

@Stateless
@LocalBean
public class StatelessTimerSessionBean {

    @Schedule(minute = "*", second = "0", dayOfMonth = "*", month = "*", year = "*", hour = "9-17", dayOfWeek = "Mon-Fri")
    public void myTimer() {
        System.out.println("Timer event: " + new Date());
    }
}

"..将EJB定时器服务的定时器数据源设置为有效的JDBC资源.."

来自EJB定时器服务

我无法弄清如何正确配置定时器数据源?

部署时出现的错误是:

SEVERE: Exception while invoking class org.glassfish.ejb.startup.EjbApplication start method
java.lang.RuntimeException: EJB Timer Service is not available

运行中: glassfish-3.1.2.2


只是出于好奇,设置非持久性计时器会起作用吗?@Schedule(second =“*/ 5”,minute =“”,hour =“”,persistent = false) - Aksel Willgert
它没有起作用。我刚刚解决了,我即将写出答案。 - ejohansson
3个回答

29

1. 示例数据库设置

  1. 我使用MySQL作为我的数据库。

  2. {GF_HOME}/glassfish/lib/install/databases/ejbtimer_{DB_ENGINE}.sql创建表EJB__TIMER__TBL

DB_ENGINE = 例如MySQL:

CREATE TABLE EJB__TIMER__TBL (
    `CREATIONTIMERAW`      BIGINT        NOT NULL,
    `BLOB`                 BLOB,
    `TIMERID`              VARCHAR(255)  NOT NULL,
    `CONTAINERID`          BIGINT        NOT NULL,
    `OWNERID`              VARCHAR(255)  NULL,
    `STATE`                INTEGER       NOT NULL,
    `PKHASHCODE`           INTEGER       NOT NULL,
    `INTERVALDURATION`     BIGINT        NOT NULL,
    `INITIALEXPIRATIONRAW` BIGINT        NOT NULL,
    `LASTEXPIRATIONRAW`    BIGINT        NOT NULL,
    `SCHEDULE`             VARCHAR(255)  NULL,
    `APPLICATIONID`        BIGINT        NOT NULL,
    CONSTRAINT `PK_EJB__TIMER__TBL` PRIMARY KEY (`TIMERID`)
);

2. 服务器配置

GlassFish Admin Console

  1. 启动您的GlassFish服务器管理控制台:通常为 http://localhost:4848
  2. 在左侧导航到 [Configurations] > [server-config] > [EJB Container]
  3. 然后点击上面的 TAB 标签 [EJB Timer Service]
  4. 然后在计时器数据源 (Timer Datasource) 中填写您的JDBC资源,例如 [mysql-pu]。(注意: 默认值为 jdbc/__TimerPool
  5. 重启服务器

3. 结果

...
INFO: [TimerBeanContainer] Created  TimerBeanContainer: TimerBean
INFO: EJB5181:Portable JNDI names for EJB TimerBean: [java:global/ejb-timer-service-app/TimerBean, java:global/ejb-timer-service-app/TimerBean!com.sun.ejb.containers.TimerLocal]
INFO: WEB0671: Loading application [ejb-timer-service-app] at [/ejb-timer-service-app]
INFO: EJB5109:EJB Timer Service started successfully for data source [mysql-pu]
INFO: Setting DBReadBeforeTimeout to false
INFO: ==> Restoring Timers ... 
INFO: There are no EJB Timers owned by this server
INFO: <== ... Timers Restored.
...

4. 仍然有问题?TimerService突然停止工作了(以前它能正常工作)?

这种情况在我进行一整天的“保存后部署”之后发生了。 TimerService突然变得不可用。

Severe:   Exception while loading the app
Severe:   Undeployment failed for context /ejb-timer-service-app
Warning:   Cannot deploy or load EJBTimerService: org.glassfish.deployment.common.DeploymentException: Error in linking security policy for ejb-timer-service-app -- Inconsistent Module State

此处找到答案

5. 有用的链接


0

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接