मैंने @Singleton, @Schedule और @Timeout एनोटेशन के साथ सरल उदाहरण बनाया है ताकि वे मेरी समस्या का समाधान कर सकें या नहीं।ejb 3.1 में टाइमर सेवा - शेड्यूल कॉलिंग टाइमआउट समस्या
परिदृश्य यह है: ईजेबी प्रत्येक 5 सीकंडों को 'चेक' समारोह कहते हैं, और यदि कुछ शर्तों को पूरा किया जाता है तो यह एकल एक्शन टाइमर बनाएगा जो असीमित फैशन में कुछ लंबी चल रही प्रक्रिया का आह्वान करेगा। (यह कतार कार्यान्वयन प्रकार की तरह है)। यह तब जांचना जारी रखता है, लेकिन लंबी चल रही प्रक्रिया होने पर यह एक और शुरू नहीं होगा।
नीचे कोड है जिसके साथ मैं आया था, लेकिन यह समाधान काम नहीं करता है, क्योंकि ऐसा लगता है कि मैं बना रहा हूं एसिंक्रोनस कॉल वास्तव में मेरी @ शेड्यूल विधि को अवरुद्ध कर रहा है।
@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");
}
मुझे यहां क्या याद आ रही है या क्या मुझे अलग अपमान की कोशिश करनी चाहिए? बहुत स्वागत कोई भी विचार :)
Glassfish 3.0.1 नवीनतम निर्माण के साथ परीक्षण - का उल्लेख
बहुत बहुत धन्यवाद, समस्या को ConcurrencyManagementType.BEAN में संयम बदलकर हल किया गया था, और हाँ, मैं लगातार झूठ में बदल जाऊंगा :) मदद के लिए धन्यवाद। – Greg
अच्छा जवाब, कुछ नया सीखा। धन्यवाद! –