2009-08-12 20 views
10

मुझे एक अंतराल टाइमर बनाने की आवश्यकता है जो सप्ताह में एक बार स्वचालित रूप से चलाने के लिए सेट है। मैं नहीं चाहता कि यह उपयोगकर्ता इनपुट के आधार पर शुरू हो, लेकिन मैं सर्वर पर तैनात होने पर इसे बनाना चाहता हूं। मैंने जो भी उदाहरण देखा है, वह टाइमर शुरू करने वाली एक और कक्षा है। मैं टाइमर बनाने के लिए एक संदेश संचालित बीन का उपयोग नहीं करना चाहता क्योंकि ऑडिट को किसी दिए गए समयावधि के लिए केवल डेटाबेस से पूछताछ करना चाहिए और संदेशों को भेजने वाले कार्यों से दूर नहीं होना चाहिए।परिनियोजन पर ईजेबी टाइमर कैसे शुरू करें?

मैंने टाइमर का एक उदाहरण शामिल किया है। नीचे दिए गए उदाहरण में, टाइमर को हर 10 मिनट में आग लगनी चाहिए। एक परीक्षण के रूप में मैं टाइमर हर 10 मिनट में आग लगाना चाहता हूं ताकि मैं टाइमर का परीक्षण कर सकूं।

@Stateless 
public class TimerTest implements 
     TimerTestLocal, TimerTestRemote{ 

    @Resource 
    private TimerService timerService; 
    private Logger log = Logger.getLogger(TimerTest.class); 
    private long interval = 1000 * 60 * 10; 
    private static String TIMER_NAME = "AuditTimer"; 

    public void scheduleTimer() throws NamingException { 
     // TODO Auto-generated method stub 
     Calendar cal = Calendar.getInstance(); 
     //cal.set(Calendar.HOUR_OF_DAY, 23);//run at 11pm 
     //cal.set(Calendar.MINUTE, 00); 
     //cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); 
     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm"); 
     log.debug("schedule for: " + sdf.format(cal.getTime())); 

     timerService.createTimer(cal.getTime(), interval, TIMER_NAME); 
    } 

    public void cancelTimer() { 
     for(Object obj : timerService.getTimers()) 
     { 
      Timer timer = (Timer)obj; 
      if(timer.getInfo().equals(TIMER_NAME)) 
       timer.cancel(); 
     } 
    } 

    @Timeout 
    public void timerEvent(Timer timer) { 
     log.debug("timer fired"); 
    } 


} 

तो क्या कोई तरीका है कि एप्लिकेशन को तैनात होने पर मैं इस टाइमर को शुरू कर सकता हूं? मुझे नहीं लगता कि सर्वर में क्लास लोडर की वजह से टाइमर को @PostConstruct विधि में रखना अच्छा विचार है।

उत्तर

16

जिस तरह से मैंने अतीत में टाइमर किया है, वह टाइमर को कॉन्फ़िगर करने के लिए web.xml में एक संदर्भ श्रोता बनाना है।

इस तरह आप यह सुनिश्चित कर सकते हैं कि यह कंटेनर से शुरू हो गया है, और ऐप को हटाए जाने पर साफ-सफाई बंद कर दें।

+0

यह बहुत अच्छा काम करता है। धन्यवाद। – scheibk

1

मुझे नहीं पता कि संदर्भकर्ता का उपयोग टाइमर शुरू करने के लिए काम कर सकता है या नहीं। इस आलेख से, how to use EJb 3 timer in a weblogic 10 cluster, ऐसा लगता है कि आप वेबलॉगिक 10.3.2 में कुछ समस्याओं में भाग ले सकते हैं।

+0

मुझे जेबॉस ईएपी 5.1 में एक ही समस्या मिली। जब संदर्भ श्रोता को बुलाया जाता है तो ईजेबी पहुंच योग्य नहीं होता है। – mekondelta

24

यदि आपकी परियोजना jee6/ejb3.1 का उपयोग कर सकती है तो इस समस्या का एक बेहतर समाधान है। http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

@javax.ejb.Schedule(minute="*/10", hour="*") 
public void automaticTimeout() { 
    logger.info("Automatic timeout occured"); 
} 

नई @Schedule एनोटेशन का उपयोग कर आप कब और कितनी बार एक टाइमआउट विधि बुलाया जाएगा के बारे में विस्तृत नियंत्रण है। बड़ा उल्टा: अब आपको "बाहर से" टाइमर शुरू करना होगा।

ओरेकल लिखते हैं:

स्वत: टाइमर EJB कंटेनर द्वारा बनाई गई हैं, जब एक उद्यम सेम कि @Schedule या @Schedules एनोटेशन के साथ एनोटेट तरीकों शामिल तैनात है। एक एंटरप्राइज़ बीन में स्वचालित प्रोग्रामआउट टाइमर के विपरीत स्वचालित टाइमआउट विधियां हो सकती हैं, जो एंटरप्राइज़ बीन क्लास में @Timeout एनोटेशन के साथ एनोटेटेड केवल एक विधि की अनुमति देती है।

+0

अपने अन्य प्रश्न का उत्तर देने के लिए – seafoxx

संबंधित मुद्दे