2014-10-16 7 views
5

मेरे पास दो टोमे उदाहरण क्लस्टर हैं।@Schedule को क्लस्टर्ड वातावरण में केवल एक बार चलाएं

हर कमरे में एक विधि की तरह

@Schedule(dayOfWeek = "*") 
public void runMeDaily() {...} 

मैं एक दिन में केवल एक बार इस विधि चलाना चाहते हैं एनोटेट है। दिन में दो बार नहीं (प्रत्येक उदाहरण पर एक)

मैं यहां Run @Scheduled task only on one WebLogic cluster node? वर्णित ध्वज का उपयोग कर सकता हूं या बस कुछ नोड का चयन कर सकता हूं, लेकिन मुझे आश्चर्य है कि ऐसा करने के लिए एक और शानदार तरीका है या नहीं।

यह प्रश्न कुछ हद तक EJB3.1 @Schedule in clustered environment से संबंधित है लेकिन मैं JBOSS का उपयोग नहीं कर रहा हूं। (और इसका उत्तर नहीं दिया गया है)

+0

https://github.com/SpringOnePlatform2016/dsyer-locks-and-leaders – MariuszS

उत्तर

1

मैं केवल एक गैर जावा ईई समाधान, मंच (स्वामित्व) के लिए विशिष्ट का उपयोग कर इस का समाधान कर सकता है। मेरे मामले में, मैं टॉमई + और क्वार्ट्ज का उपयोग कर रहा हूं। क्लस्टर मोड में क्वार्ट्ज चलाना (org.quartz.jobStore.isClustered = true) और टाइमर को ट्रिगर करने के लिए एक उदाहरण चुनने के लिए क्वार्ट्ज को एक डेटाबेस में टाइमर को बनाए रखना, इसलिए यह केवल एक बार चलाएगा।

यह लिंक बहुत उपयोगी था - http://rmannibucau.wordpress.com/2012/08/22/tomee-quartz-configuration-for-scheduled-methods/

यह एक शर्म की बात है कि जावा ईई के लिए एक व्यवहार निर्दिष्ट नहीं करता है। (फिर भी, मुझे आशा है) :-)

2

मैं अन्य धागे के समान दृष्टिकोण का उपयोग कर रहा हूं - यह जांचना कि विशेष मेजबान नौकरी चलाने के लिए सही है। लेकिन ..

मुझे बहुत जानकारी नहीं है, लेकिन वसंत ऋतु में आप इसके लिए प्रोफ़ाइल का उपयोग कर सकते हैं। शायद आप अपनी जरूरतों के लिए समान समाधान पा सकते हैं। http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles

पर एक नजर डालें आप दो अलग सेम परिभाषित कर सकते हैं:

@Configuration 
@Profile("dev") 
public class StandaloneDataConfig { 

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder() 
     .setType(EmbeddedDatabaseType.HSQL) 
     .addScript("classpath:com/bank/config/sql/schema.sql") 
     .addScript("classpath:com/bank/config/sql/test-data.sql") 
     .build(); 
} 
} 

@Configuration 
@Profile("production") 
public class JndiDataConfig { 

@Bean 
public DataSource dataSource() throws Exception { 
    Context ctx = new InitialContext(); 
    return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource"); 
} 
} 

और जो एक प्रोफ़ाइल स्विचन द्वारा चालू करने के लिए निर्णय लेते हैं। तो आपकी कक्षा @ scheduled एनोटेटेड विधि के साथ केवल विशिष्ट प्रोफ़ाइल के लिए लोड किया जाएगा। तब तक आपको केवल नोड्स पर प्रोफ़ाइल चालू करने के लिए अपने ऐप को कॉन्फ़िगर करने की आवश्यकता है। वसंत ऐप में यह गुजरने के रूप में सरल होगा -Dspring.profiles.active = प्रोफ़ाइल उनमें से एक के लिए।

+0

अच्छा विचार, मैं इसे देख लूँगा :-) मुझे डर है कि मैं कर सकता हूं ' इस परियोजना में वसंत में अभी स्विच नहीं है, लेकिन मैं निश्चित रूप से अगले विकल्प में आपका विकल्प मानूंगा। धन्यवाद! जैसा कि मैंने कहा, – Leo

+0

, आप शायद ejb में कुछ समान खोज सकते हैं। – freakman

-1

मैंने बॉक्स में से एक को मास्टर के रूप में बनाकर इस समस्या को हल किया। मूल रूप से मास्टर = सत्य जैसे बॉक्स में से एक पर एक पर्यावरण चर सेट करें।

और system.getenv ("मास्टर") के माध्यम से इसे अपने जावा कोड में पढ़ें। यदि यह वर्तमान और इसके सत्य है तो अपना कोड चलाएं।

बुनियादी टुकड़ा

@schedule() 
void process(){ 
boolean master=Boolean.parseBoolean(system.getenv("master")); 
if(master) 
{ 
    //your logic 
} 

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