Timer Service in ejb 3.1 - Zeitüberschreitungsproblem bei Aufrufen planen

Ich habe ein einfaches Beispiel mit @Singleton-, @Schedule- und @Timeout-Annotationen erstellt, um zu versuchen, ob sie mein Problem lösen würden.

Das Szenario lautet wie folgt: EJB ruft alle 5 Sekunden die Funktion 'check' auf. Wenn bestimmte Bedingungen erfüllt sind, wird ein einzelner Aktions-Timer erstellt, der einen lang andauernden Prozess asynchron aufruft. (Es ist eine Art Warteschlangenimplementierung). Es prüft dann weiter, aber solange der Prozess noch läuft, startet es keinen weiteren.

Below ist der Code, den ich mir ausgedacht habe, aber diese Lösung funktioniert nicht, da mein asynchroner Aufruf tatsächlich meine @Schedule-Methode blockiert.

@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");

    }

Was fehle ich hier oder sollte ich einen anderen Ansatz ausprobieren? Irgendwelche Ideen sind herzlich willkommen:)

Testing mit Glassfish 3.0.1 neuesten Build - vergessen zu erwähnen

Antworten auf die Frage(1)

Ihre Antwort auf die Frage