2011-05-07 3 views
0

j'ai deux délais d'attente définis:
délai d'attente A - toutes les 30 secondes
délai B - toutes les 2 minutes
EJB Timer Service: ordre de délais d'attente

// scheduled for timeout A (every 30sec) 
@Stateless 
public class MyBeanA { 
    (...) 

    @Timeout 
    public void onTimeoutA(javax.ejb.Timer timer) { 
    // (...) 
    } 
} 

// scheduled for timeout B (every 2min) 
@Stateless 
public class MyBeanB { 
    (...) 

    @Timeout 
    public void onTimeoutB(javax.ejb.Timer timer) { 
    // (...) 
    } 
} 

Il est facile de remarquer que, après toutes les 2 minutes , les deux délais d'attente seront tirés. Je voudrais m'assurer que dans ce cas, le délai A sera déclenché avant le délai B:
(30sec): timeoutA, (60sec): timeoutA, (90sec): délai d'attenteA, (120sec): timeoutA, timeoutB

Est-ce possible avec l'API de service de minuterie standard EJB (3.0)? Mon serveur d'application est JBoss.

Merci à l'avance, Piotr

+0

Peut-être que vous pourriez tout simplement permettre de contrôler un tout. C'est à dire. Exécutez A toutes les 30 secondes et tous les 4 événements (120 secondes) laissez-le faire son traitement et ensuite appelez la méthode appropriée sur Bean B. – planetjones

Répondre

1

Il n'y a aucun moyen intégré pour commander des minuteries comme ça. Vous pouvez le faire manuellement:

  1. Programmer une minuterie simple action A en 30 secondes avec info = 1
  2. Planifier un intervallomètre B pendant 120 secondes
  3. Quand un feu avec info = 1, programmer un temporisateur à action unique pour A en 30 secondes avec info = 2
  4. Lorsque A se déclenche avec info = 2, programmer un seul temporisateur d'action pour A en 30 secondes avec info = 3
  5. Quand A se déclenche avec info = 3 , ne pas replanifier
  6. Lorsque B se déclenche, appelez A, puis faites le rk pour B. Programmer un temporisateur à action unique pour A en 30 secondes avec info = 1
0

La solution que j'ai utilisée est très similaire à celle donnée par bkail. Il existe une méthode ejbTimeout() programmée pour être déclenchée toutes les 30 secondes. Timeout est planifié avec l'objet Serializable contenant le compteur:

createTimer(Date initialExpiration, long intervalDuration, Serializable info) 

Chaque fois que ejbTimeout est appelé, le compteur est augmenté. Si elle atteint 3, alors la méthode qui devrait être tiré au bout de 2 minutes est invoquée, et aussi compteur est remis à 0. Il fonctionne comme suit:

 
ejbTimeout after 30sec (counter == 0): call A(); counter++; 
ejbTimeout after 30sec (counter == 1): call A(); counter++; 
ejbTimeout after 30sec (counter == 2): call A(); counter++; 
ejbTimeout after 30sec (counter == 3): call A(); call B(); counter = 0; 
+0

Cela fonctionnera probablement dans la plupart des cas, mais je noterai que les timers sont persistants dans EJB 3.0, mais la variable de compteur ne sera pas. –

Questions connexes