Definir / configurar o DataSource do Serviço de Timer EJB

Estou tentando usar o serviço de timer no EJB 3.1 no meu aplicativo.

@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()); } } 

“.. defina a configuração Timer DataSource do Serviço de Timer EJB para um recurso JDBC válido.”

do EJB Timer Service

Não consigo descobrir como configurar corretamente a fonte de dados do timer?

O erro que recebo ao implantar é:

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

Corrida: glassfish-3.1.2.2

1. Exemplo de Configuração do Banco de Dados

  1. Eu uso o MySQL para meu database.

  2. Crie a tabela EJB__TIMER__TBL de {GF_HOME}/glassfish/lib/install/databases/ejbtimer_{DB_ENGINE}.sql

DB_ENGINE = por exemplo, 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. Configuração do Servidor

Console de administração do GlassFish

  1. Inicie o console de administração do servidor GlassFish: geralmente http://localhost:4848
  2. À sua esquerda, navegue para [Configurações]> [server-config]> [Contêiner EJB]
  3. Em seguida, clique no botão TAB up top [EJB Timer Service]
  4. Em seguida, preencha Timer Datasource : com seu Recurso JDBC, por exemplo. [mysql-pu] ( Nota: Padrões para jdbc/__TimerPool )
  5. Reinicie o servidor

3. O Resultado

 ... 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. Ainda está quebrado? TimerService apenas parou de funcionar (costumava funcionar)?

Então isso aconteceu comigo depois de um dia cheio de "implantar em salvar". O TimerService estava indisponível de repente.

 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 

Solução encontrada aqui

5. Links Úteis

  • Oracle: para implantar um timer EJB em um cluster

No JBoss / WildFly, você pode seguir estas instruções:

Mastertheboss.com: Criando Timers EJB 3 em cluster
Publicado em: 08 de março de 2015

Parece que o glassfish-3.1.2.2 não suporta o EJB3, tente usar o jboss 7.

http://docs.oracle.com/cd/E26576_01/doc.312/e24939/release-notes.htm