En el caso de las novedades introducidas por JavaEE 6 a la nueva versión de EJB encontramos, al contrario que en el caso de JPA, cambios bastante substanciales que nos proporcionan nuevos mecanismos para facilitar el trabajo de desarrollo de aplicaciones corporativas. Curiosamente los especificadores sólo han estimado oportuno modificar la versión menor de la especificación pese a los cambios, cuando con JPA ha pasado justo lo contrario (no muchos cambios pero un salto de versión mayor).

Vista sin interfaz

Ya no es necesario crear un interfaz para el acceso local de un EJB.

Singleton

El patrón de desarrollo del singleton es bastante utilizado.Una clase de la que sólo queremos una instancia en nuestro sistema. Durante mucho tiempo esto se ha podido realizar mediante un método de factoría o un constructor especializado. Sin embargo los mecanismos introducidos por EJB 3.1 para este tipo de bean de sesión van más allá de controlar el número de instancias y proporciona también mecanismos de control de acceso de mayor nivel que una implementación manual mediante los mecanismos de programación concurrente de Java.Estos nuevos beans de sesión se pueden crear anotándolos con @Singleton y el contenedor garantiza que sólo existirá una instancia. Son adecuados para datos compartidos como diccionarios, caches, etc.La concurrencia de acceso es gestionada por defecto por el contenedor. Los métodos del singleton son accedidos por un sólo hilo de ejecución (acceso por exclusión). Se diferencia entre accesos de lectura (READ) o de lectura y escritura (WRITE). Se permiten múltiples accesos de lectura simultáneamente pero sólo uno de escritura (que evita además todos los de lectura). Los métodos que no especificamos se consideran de tipo WRITE. Para especificar el tipo de cada método se utilizan las anotaciones @Lock(READ) y @Lock(WRITE).

Planificador (cron)

The annotation Schedule is used to automatically create a timer. It is applied to a method which will be used as timeout callback.

Ejemplo:

@Stateless
public class TimerEJB { 

   @Schedule(dayOfWeek="Mon")
   public void itIsMonday(Timer timer) { (...) }

   @Schedule(dayOfMonth="Last")
   public void itIsEndOfMonth(Timer timer) { (...) }

}

Flexibilidad de la anotación:

Every Tuesday at 7.30am 
@Schedule(hour = "7", minute = "30",  dayOfWeek = "Tue")

From Monday to Friday, at 7, 15 and 20 
@Schedule(hour = "7, 15, 20", dayOfWeek = "Mon-Fri")

Every hour on Sundays 
@Schedule(hour = "*", dayOfWeek = "0")

Last Friday of December, at 12 
@Schedule(hour = "12", dayOfMonth = "Last Fri", month="Dec")

Three days before the last day of the month, for every month of 2009, at 8pm
@Schedule(hour = "20", dayOfMonth = "-3", year="2009")

Every 5 minutes of every hour, starting at 3pm
@Schedule(minute = "*/5", hour = "15/1")

Invocaciones asíncronas

@Asynchronous
public Future<String> sayBye() {
   String bye = executeLongQuery();
   return new AsyncResult<String>(bye);
}

Referencias