2016-03-29 7 views
9

से असाइन करने योग्य नहीं है। मैं कुछ चलाने की कोशिश कर रहा हूं जो मैं महीनों के लिए विभिन्न स्थितियों के तहत सफलतापूर्वक चल रहा हूं। मैं Java12 चलाने वाले जावा एप्लिकेशन से स्केल-लाइब्रेरी 2.11.7 के साथ अक्का-अभिनेता_2.11 2.3.4 का उपयोग कर रहा हूं। जैसा कि मैंने कहा, वही कोड महीनों के लिए काम करता है। सबसे हाल ही में परिस्थितियों में, मैं हो रही है निम्नलिखित:क्लासकास्टएक्सप्शन: इंटरफ़ेस akka.actor.Scheduler कक्षा akka.actor.LightArrayRevolverScheduler

java.lang.ClassCastException: interface akka.actor.Scheduler is not assignable from class akka.actor.LightArrayRevolverScheduler 
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:69) 
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:66) 
at scala.util.Try$.apply(Try.scala:192) 
at akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:66) 
at akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.scala:84) 
at akka.actor.ActorSystemImpl.createScheduler(ActorSystem.scala:677) 
at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:576) 
at akka.actor.ActorSystem$.apply(ActorSystem.scala:142) 
at akka.actor.ActorSystem$.apply(ActorSystem.scala:109) 
at akka.actor.ActorSystem$.create(ActorSystem.scala:57) 
at akka.actor.ActorSystem.create(ActorSystem.scala) 

सवाल में कॉल है: system= ActorSystem.create("MyActorSystem");

इस कॉल एक वर्ग है, जो गतिशील रूप से लोड किया जाता है के लिए निर्माता में होता है, getConstructor(...).newInstance(...) आला प्रतिबिंब के माध्यम से ।

समस्या उत्पन्न हुई है जब वितरित गणना पर्यावरण के उपयोगकर्ता ने लिखा है कि यह एक नौकरी निष्पादित करने की कोशिश करता है जो गतिशील रूप से नौकरी को तत्काल करता है जो गतिशील रूप से नौकरी (प्रतिबिंबित तत्कालता के 2 स्तर) को तुरंत चालू करता है। असल में, इस छद्म कॉल सूची की तरह कुछ:

reflectivelyCreate(job) 
job.reflectivelyCreate(job2) 
job2.instantiateActorSystem() 
<fail> 

अगर मैं निम्नलिखित तरीके से ठीक उसी कोड चलाएँ:

reflectivelyCreate(job2) 
job2.instantiateActorSystem() 
<success> 

सब कुछ काम करता है।

मेरा सवाल यह है कि जावा में पीछे के दृश्यों के साथ कुछ राज्य वर्ग वर्ग लोडर-संबंधित जादू हो रहा है, जैसे कि अक्का की स्थिति इसके बारे में गलत है। इसी तरह के मुद्दों को मैंने पाया (Akka ActorSystem creation issue) थ्रेडिंग/स्कैला प्रतिलिपि आमंत्रण के साथ करना प्रतीत होता था, लेकिन मेरा कोड एकल-थ्रेडेड है, और उपरोक्त सफलता और विफलता दोनों मामलों में उसी तरह से आह्वान किया गया है। समस्याग्रस्त आमंत्रण केवल कॉल स्टैक की गहराई में अंतर के साथ होता है जहां तक ​​मैं अब तक बता सकता हूं।

मैं अक्का गुरु से किसी भी इनपुट की सराहना करता हूं!

+2

मान लीजिए कि कक्षा 'akka.actor.LightArrayRevolverScheduler' वास्तव में, इंटरफ़ेस' akka.actor.Scheduler' को कार्यान्वित करती है, आपके स्टैक ट्रेस में प्रस्तुत अपवाद के लिए एकमात्र संभावित स्पष्टीकरण 'क्लासलोडर' के साथ मजेदार व्यापार के आसपास घूमना। मुझे डर है कि मुझे अक्का के दस्तावेज को प्रासंगिक विस्तार में कमी की तलाश है, हालांकि, मेरे पास प्रस्ताव देने का कोई समाधान नहीं है। –

+0

मैं सिंगलटन पैटर्न उपयोग के साथ समस्या के आसपास काम करने में सक्षम हूं, जो प्रासंगिक अभिनेता सिस्टम घटक को समाहित करता है, जिसे मैं अपनी जावा प्रक्रिया की शुरुआत में प्रारंभ कर सकता हूं और आवश्यकतानुसार प्राप्त कर सकता हूं। मुझे यह तब तक नहीं करना पड़ा जब तक कि इस अजीब समस्या का सामना नहीं हुआ, और शायद किसी और के पास एक समान समस्या होगी और शायद किसी को पता से किसी स्पष्टीकरण से लाभ होगा। – mephicide

+0

हो सकता है कि आप निर्भरता संस्करण समस्याएं हो रहे हों। इमारत के लिए आप क्या उपयोग करते हैं? यदि आप मेवेन और पोम का उपयोग करते हैं, तो क्या होता है यदि आप ... का उपयोग कर संस्करणों को पिन करते हैं? –

उत्तर

1

यदि कोई और इस पर ठोकर खाता है; मेरे मामले में समस्या यह थी कि मैं एक ही प्रक्रिया के भीतर एक स्केल दुभाषिया का उपयोग कर रहा था जो अक्का का उपयोग भी कर सकता है। अन्य बहु-श्रेणी लोडर परिदृश्य एक ही समस्या प्रदर्शित कर सकते हैं। यहाँ मेरे मामले के लिए ठीक है:

  • classloader मुझे पसंद है (एक है कि अक्का पुस्तकालयों लोड) private static ClassLoader ourClassLoader = CmdLineMain.class.getClassLoader();
  • के साथ कार्यक्रम प्रारंभ पर एक स्थिर क्षेत्र में स्केला दुभाषिया इस्तेमाल करने के बाद (जो जाहिरा तौर पर classloader की जगह सहेजें एक यह पसंद करती है) के साथ, फोन Thread.currentThread().setContextClassLoader(ourClassLoader);

मेरे कार्यक्रम एकल पिरोया है, लेकिन निश्चित रूप से समस्या ऐसी है कि प्रत्येक थ्रेड का अपना लोडर का कहना है हल करने के लिए अन्य तरीके हैं। यह इस पोस्ट के दायरे से बाहर है;)

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