मैं एक grails ऐप्लिकेशन में पृष्ठभूमि प्रसंस्करण सेटअप की एक विशिष्ट प्रकार बनाने के लिए कोशिश कर रहा हूँ में पृष्ठभूमि धागे में हाइबरनेट कॉलिंग।grails
- एक निश्चित आकार थ्रेड पूल केवल नौकरियों के बैच की अवधि
- एक ही सत्र प्रत्येक थ्रेड द्वारा बनाए रखा है के लिए मौजूद है
- प्रत्येक काम एक अलग लेन-देन में चलता है
मैं निम्नानुसार नौकरी शुरू करने की कोशिश कर रहा हूं:
int poolSize = 10
ThreadFactory factory = new MyThreadFactory (Executors.defaultThreadFactory())
ExecutorService pool = Executors.newFixedThreadPool (poolSize, factory)
(1..100).each { i ->
pool.submit {
try {
MyDomainClass.withTransaction {
doSomeWork(i)
}
} catch (Exception e) {
log.error "error in job ${i}", e
}
}
}
MyThreadFactory धागे जो एक हाइबरनेट सत्र धागा की अवधि के लिए संलग्न पैदा करता है।
class MyThreadFactory implements ThreadFactory {
ThreadFactory delegate
PersistenceContextInterceptor persistenceInterceptor
MyThreadFactory (ThreadFactory delegate) {
this.delegate = delegate
ApplicationContext applicationContext = ApplicationHolder.getApplication().getMainContext()
persistenceInterceptor = applicationContext.getBean("persistenceInterceptor");
}
Thread newThread (Runnable work) {
return delegate.newThread {
persistenceInterceptor.init()
try {
work.run()
} finally {
persistenceInterceptor.flush()
persistenceInterceptor.destroy()
}
}
}
}
ऐसा लगता है, हालांकि पहली बार जब मैं बैच नौकरी चलाता हूं तो मुझे निम्न त्रुटि मिल जाएगी। कोई प्रभाव के साथ, (बाद में नौकरियों घटना के बिना चलाने)
groovy.lang.MissingMethodException: No signature of method: static MyDomainClass.save() is applicable for argument types: (java.util.LinkedHashMap) values: [[flush:false]]
Possible solutions: save(), save(java.util.Map), save(java.lang.Boolean), wait(), any(), wait(long)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at ...
मैं MyDomainClass.withNewSession {} साथ persitanceInterceptor की जगह की कोशिश की है।
ऐसा लगता है कि GORM तरीकों मेरे डोमेन कक्षाओं में इंजेक्शन नहीं जा रहा है।
किसी को भी मैं गलत क्या कर रही हूं, और क्यों बैच कार्य फिर से चलाने के देख सकते हैं यह सफल होने के लिए अनुमति देता है?
पूर्णता के लिए @fixitagain काम इस रूप ले लेता है:
doSomeWork = { id ->
MyDomainClass a = MyDomainClass.findById (id)
a.value = lotsOfWork()
a.save()
}
मेरा मानना है कि लापता बचाने एक रेड हेरिंग है, जैसा कि मैंने एक सौदे में सक्रिय लपेटकर की कोशिश की, और फिर कह 'कोई त्रुटि मिलती है DomainClass.withTransaction (क्लोजर) 'परिभाषित नहीं किया गया है।
ऐसा लगता है कि पहली नौकरी दौड़ने में विफल रही है, लेकिन पहली नौकरी चलाने के बाद विफल हो जाती है, लेकिन कुछ के बाद सफलतापूर्वक चल रही है?) शुरू हो गया है।
किस बिंदु पर वह Grails जीवन चक्र आप अपनी नौकरियां शुरू कर रहे हैं? ऐसा लगता है इससे पहले कि डोमेन और गतिशील तरीकों आदि –
नौकरियों (अब के लिए) एक नियंत्रक कार्रवाई से ट्रिगर हो रहे हैं के साथ सजाया गया है जैसे कि यह होने वाली है, तो यह अच्छी तरह से करने के बाद डोमेन सजाया गया है है। मुझे ध्यान रखना चाहिए कि अगर मैं मुख्य धागे से सभी नौकरियों को बुलाता हूं, तो कोई समस्या नहीं होती है। – Akusete
अच्छी तरह से, मेरे लिए GORM "संलग्न" है क्योंकि यह संभावित समाधान के रूप में सहेजने (मानचित्र) का प्रस्ताव दे रहा है। क्या आप उस लाइन को डाल सकते हैं जहां आप सहेज रहे हैं। BTW फ्लश डिफ़ॉल्ट रूप से गलत है, जिसका अर्थ यह हाइबरनेट सत्र के अंत में फ्लश ... – fixitagain