2017-09-07 5 views
0

Maintenant, je suis this exemple pour obtenir la chose exacte décrite.Minuteur Evénement non déclenché dans l'entité SBB respective

Ce que je veux

  1. Recevez un événement d'une ressource
  2. Utilisez la méthode timerFacility.setTimer dormir pour une durée déterminée 5 secondes
  3. Après 5 secondes passent, les besoins de service pour envoyer un message à la ressource (en onTimerEvent sur)

Lorsque le problème estCe qui précède est parfaitement réalisé pour un événement déclenché un à la fois, mais lorsqu'un événement est déclenché plusieurs fois avec un intervalle inférieur à 5, alors onTimerEvent est invoqué avec le dernier contexte d'activité pour les deux demandes, le nouveau contexte semble en quelque sorte pour remplacer la précédente)

SBB classe

Déclaration:

// ////////////////////////////////////////////////////////// 
// Null Activities declaration for the timer event 
// //////////////////////////////////////////////////////// 

private NullActivityContextInterfaceFactory nullACIFactory; 

private NullActivityFactory nullActivityFactory; 

méthode setSbbContext:

public void setSbbContext(SbbContext context) { 
    this.sbbContext = (SbbContextExt) context; 
    logger = this.sbbContext.getTracer(getClass().getName()); 
    logger.info("TimerSbb context set"); 
    // this.timerFacility = this.sbbContext.getTimerFacility(); 

    try { 

     final Context myEnv = (Context) new InitialContext(); 

     // slee facilities 
     this.timerFacility = (TimerFacility) myEnv.lookup(TimerFacility.JNDI_NAME); 
     this.nullACIFactory = (NullActivityContextInterfaceFactory) myEnv.lookup(NullActivityContextInterfaceFactory.JNDI_NAME); 
     this.nullActivityFactory = (NullActivityFactory) myEnv.lookup(NullActivityFactory.JNDI_NAME); 

     // // the sbb interface to interact with SIP resource adaptor 
     // this.sipProvider = (SleeSipProvider) myEnv.lookup("java:comp/env/slee/resources/jainsip/1.2/provider"); 

    } catch (Exception e) { 
     logger.severe("Failed to set sbb context", e); 
    } 
} 

onTimerEvent:

public void onTimerEvent(javax.slee.facilities.TimerEvent event, ActivityContextInterface aci) { 

    this.logger.info("[" + this.getRefId() + "] new TimerEvent Fired"); 
    // detaching so the null AC is claimed after the event handling 

    aci.detach(sbbContext.getSbbLocalObject()); 
    this.logger.info("[" + this.getRefId() + "] context detatched"); 

    try { 

     // // create child 
     // 
     // DataSourceChildSbbLocalInterface child = (DataSourceChildSbbLocalInterface) getLocationChildRelation().create(); 
     // 
     // // request bindings of the message target 
     // 
     // child.getBindings(getSender().getURI().toString()); 

    } catch (Exception e) { 
     logger.severe("failed to create sip registrar child sbb, to lookup the sender's contacts", e); 
     return; 
    } 

} 

sur un message de l'événement:

public void onTelnetMessageEvent(com.kalsym.event.MessageEvent event, ActivityContextInterface aci/* , EventContext eventContext */) { 

    try { 
     // //////////////////////////////////////////////////////////////// 

     this.logger.info("onTelnetMessageEvent"); 
     String message = event.getMessage(); 
     String refId = event.getRefId(); 
     this.setRefId(message); 
     this.logger.info("[" + this.getRefId() + "] Received onTelnetMessageEvent with message: " + message); 

     int timerDurationInSecs = 5; 

     ActivityContextInterface timerACI = this.nullACIFactory.getActivityContextInterface(this.nullActivityFactory.createNullActivity()); 

     timerACI.attach(this.sbbContext.getSbbLocalObject()); 
     // Have tried all TimerPreserveMised options here 
     TimerPreserveMissed tpm = TimerPreserveMissed.LAST; 
     // Have tried new TimerOptions() as well 
     TimerOptions options = new TimerOptions(5000, tpm); 

     this.timerFacility.setTimer(timerACI, null, System.currentTimeMillis() + timerDurationInSecs * 1000, options); 

     // //////////////////////////////////////////////////////////////// 
    } catch (Exception exp) { 
     this.logger.severe("Error in recieving Telent Event", exp); 
    } 
} 

Ceci est mon SBB-pot:

<event event-direction="Receive" initial-event="False"> 
     <event-name>TimerEvent</event-name> 
     <event-type-ref> 
      <event-type-name>javax.slee.facilities.TimerEvent</event-type-name> 
      <event-type-vendor>javax.slee</event-type-vendor> 
      <event-type-version>1.0</event-type-version> 
     </event-type-ref> 
    </event> 
    <event event-direction="Receive" initial-event="True"> 
     <event-name>TelnetMessageEvent</event-name> 
     <event-type-ref> 
      <event-type-name>TelnetMessageEvent</event-type-name> 
      <event-type-vendor>kalsym</event-type-vendor> 
      <event-type-version>1.0</event-type-version> 
     </event-type-ref> 
    </event> 

Ceci est la sortie que je reçois:

2017-09-06 16:14:17,734 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-0-thread-1) TimerSbb context set 

2017-09-06 16:14:17,743 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-0-thread-1) onTelnetMessageEvent 
2017-09-06 16:14:17,745 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-0-thread-1) [d] Received onTelnetMessageEvent with message: d 

2017-09-06 16:14:19,396 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-2-thread-1) onTelnetMessageEvent 
2017-09-06 16:14:19,396 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-2-thread-1) [f] Received onTelnetMessageEvent with message: f 




2017-09-06 16:14:22,750 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-7-thread-1) [f] new TimerEvent Fired 


2017-09-06 16:14:24,398 INFO [javax.slee.SbbNotification[service=ServiceID[name=timer,vendor=trangec,version=1.0],sbb=SbbID[name=TimerSbb,vendor=trangec,version=1.0]].trangec.timer.TimerSbbImpl] (SLEE-EventRouterExecutor-0-thread-1) [f] new TimerEvent Fired 

Les deux dernières lignes de journal doivent imprimer respectivement d et f au lieu de f et f, veuillez suggérer ce que je fais de mal?

Répondre

0

Le journal en onTimerEvent affiche le message [f] deux fois parce que c'est le dernier que vous avez enregistré dans l'attribut id Ref:

this.setRefId(message); 

Vous pouvez utiliser une carte pour associer l'ID de minuterie au message reçu, et puis récupérez-le lors du traitement du onTimerEvent.