2010-01-21 5 views
14

मैं ईजेबी 3 के लिए नया हूं। मैं निम्नलिखित कोड का उपयोग तो बुला यहअंतहीन ईजेबी 3 टाइमर को कैसे रोकें?

timer = timerService.createTimer(10, 5000, null); 

यह अच्छी तरह से काम करता है JBoss 4.2.3

@Stateless 
public class SimpleBean implements SimpleBeanRemote,TimerService { 

@Resource 
TimerService timerService; 
private Timer timer ; 
@Timeout 
public void timeout(Timer timer) { 
    System.out.println("Hello EJB"); 

} 
} 

पर अंतहीन EJB 3 टाइमर शुरू करने के लिए तो यह तैनाती। मैंने एक क्लाइंट क्लास बनाया है जो एक विधि को कॉल करता है जो टाइमर और एक विधि बनाता है जिसे टाइमर टाइम्स कहा जाता है।

मैं रद्द करने के लिए कॉल करना भूल जाता हूं तो यह रुकता नहीं है। रद्द कॉल के साथ पूर्व-नियोजन इसे कभी नहीं रोकता है। Jboss को पुनरारंभ करें 4.2.3 इसे कभी नहीं रोकें। मैं ईजेबी टाइमर कैसे रोक सकता हूं? मदद के लिए धन्यवाद।

उत्तर

26
public void stop(String timerName) { 
    for(Object obj : timerService.getTimers()) { 
     Timer t = (Timer)obj; 
     if (t.getInfo().equals(timerName)) { 
     t.cancel(); 
     } 
    } 
} 
+2

तीन के बाद वर्ष, धन्यवाद एक बहुत :) – mebada

+0

यह सभी टाइमर बंद करता है, लेकिन आप "getTimers()" वे अभी भी वहाँ से परामर्श अगर:/ – jmlv21104

+0

नहीं! यह केवल उन टाइमर को रद्द कर देगा जिनके नाम 'टाइमरनाम' के समान हैं। –

2

आप भी अपने आवेदन undeploy कर सकते हैं, इस "मारने" होगा सभी टाइमर।

3

मुझे अपने जेबॉस एएस 6.1 के साथ एक ही समस्या थी।
इस अंतहीन (लगातार) टाइमर को मारने के बाद मुझे भविष्य में समस्या से बचने के लिए निम्न समाधान मिला:
जेबॉस एएस 6.1 (ईजेबी 3.1) के साथ गैर-निरंतर स्वचालित टाइमर बनाना संभव है, वे एक जीवित नहीं हैं सर्वर को पुनः आरंभ:

@Schedule(minute=”*/10”, hour=”*”, persistent=false) 
public void automaticTimeout() { 
2

एक अन्य विधि 'जानकारी' विशेषता के साथ ethe स्वत: टाइमर (@Schedule) creat करने के लिए और फिर उसी की जानकारी के साथ टाइमर के लिए टाइमर सेवा में जाँच करें और यदि उपलब्ध हो इसे रद्द है:

@Schedule(hour="*", minute="*",second="3", persistent=false,info="AUTO_TIMER_0") 
void automaticTimeOut(){ 

    if(timerCount==0){System.out.println("FROM AUTOMATIC TIME OUT -----------------> CALLED");timerCount++;} 
    else{ 

     Iterator<Timer> timerIterator=timerService.getTimers().iterator(); 

     Timer timerToCancel=null; 
     while(timerIterator.hasNext()){ 

      Timer tmpTimer=timerIterator.next(); 
      if(tmpTimer.getInfo().equals("AUTO_TIMER_0")){timerToCancel=tmpTimer;break;} 

     }//while closing 

     if(timerToCancel!=null){ 

      timerToCancel.cancel(); 
      System.out.println("AUTOMATIC TIMER HAS BEEN CANCELED ----------------->>>>"); 

     }//if closing 

    }//else closing 

}//automaticTimeOut closing 
0

बीन के भीतर @PreDestroy एनोटेशन का प्रयास करें जहां आप बंद करना चाहते हैं।

उदाहरण के लिए:

@PreDestroy 
private void undeployTimer() { 
//.. 
} 

आम तौर पर संसाधन de-आवंटन यहां किया जाता है।

0

ईजेबी 3.1 के बाद, TimerService पर नई विधियां हैं जो Serializable पेलोड के बजाय TimerConfig लेती हैं। TimerConfig का उपयोग Timer गैर-लगातार बनाने की अनुमति देता है।

timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));