He creado sencillo ejemplo con @Singleton, @Programar y @tiempo de espera anotaciones para probar si se iba a solucionar mi problema.

El escenario es este: EJB de las llamadas de » verificación de la función de cada 5 seg, y si se cumplen ciertas condiciones se va a crear una sola acción temporizador que invocan algunos procesos en ejecución en asincrónica de la moda. (es una especie de cola de implementación tipo de cosas). Luego continúa para comprobar, pero mientras que el largo proceso de ejecución es de allí, no iniciar otro.

A continuación se muestra el código que se me ocurrió, pero esta solución no funciona, porque parece que la llamada asincrónica estoy haciendo es, de hecho, el bloqueo de mi @Programar método.

@Singleton
@Startup
public class GenerationQueue {

    private Logger logger = Logger.getLogger(GenerationQueue.class.getName());

    private List<String> queue = new ArrayList<String>();

    private boolean available = true;

    @Resource
    TimerService timerService;

    @Schedule(persistent=true, minute="*", second="*/5", hour="*")
    public void checkQueueState() {

        logger.log(Level.INFO,"Queue state check: "+available+" size: "+queue.size()+", "+new Date());

        if (available) {

            timerService.createSingleActionTimer(new Date(), new TimerConfig(null, false));
        }

    }

    @Timeout
    private void generateReport(Timer timer) {

        logger.info("!!--timeout invoked here "+new Date());

        available = false;

        try {

            Thread.sleep(1000*60*2); //something that lasts for a bit

        } catch (Exception e) {}

        available = true;

        logger.info("New report generation complete");

    }

Lo que me estoy perdiendo aquí o debo tratar diferentes abordaje? Las ideas más cordial bienvenida 🙂

Pruebas con Glassfish 3.0.1 última generación – se olvidó de mencionar

OriginalEl autor Greg | 2010-04-22

1 Comentario

  1. 11

    El valor predeterminado @ConcurrencyManagement para singleton es ConcurrencyManagementType.CONTENEDOR con forma predeterminada @Bloqueo de LockType.ESCRIBIR. Básicamente, esto significa que cada método (incluyendo generateReports) es, efectivamente, marcados con la palabra clave synchronized, lo que significa que checkQueueState se bloque, mientras que generateReport se está ejecutando.

    Considerar el uso de ConcurrencyManagement(ConcurrencyManagementType.BEAN) o @de Bloqueo(LockType.LEA). Si ni sugerencia de ayuda, tengo la sospecha de que usted haya encontrado un Glassfish error.

    Como un aparte, usted probablemente querrá persistente=falso, ya que probablemente no sea necesario para garantizar que el checkQueueState método de incendios cada 5 segundos, incluso cuando el servidor está fuera de línea. En otras palabras, probablemente no necesita el recipiente al fuego «charlas» cuando usted trae su servidor en línea.

    Muchas gracias, el problema fue resuelto por un cambio de concurency a ConcurrencyManagementType.BEAN, y sí, voy a cambiar la persistente a false 🙂 Gracias por la ayuda.
    Bonita respuesta, aprendí algo nuevo. Gracias!

    OriginalEl autor Brett Kail

Dejar respuesta

Please enter your comment!
Please enter your name here