Sto provando a creare un tipo specifico di impostazione di elaborazione in background in un'applicazione Grails.Chiamata Hibernate in background thread in grails
- Un dimensione fissa filo piscina esiste solo per la durata del lotto di posti di lavoro
- Un singola sessione viene mantenuto da ogni thread
- Ogni lavoro viene eseguito in un transazione separata
Sto tentando di avviare il lavoro nel modo seguente:
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 crea fili che hanno una sessione sospensione attaccati per la durata del filo.
Sembra funzionare, tuttavia verrà visualizzato il seguente errore la prima volta che eseguo il processo batch. (Lavori successivi eseguiti senza incidenti)
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 ...
Ho provato a sostituire il persitanceInterceptor con MyDomainClass.withNewSession {}, senza alcun effetto.
Sembra che i metodi GORM non vengano iniettati nelle mie classi di dominio.
Qualcuno può vedere cosa sto facendo male e perché eseguire di nuovo il processo batch consente di avere successo?
@fixitagain Per completezza il lavoro assume questa forma:
doSomeWork = { id ->
MyDomainClass a = MyDomainClass.findById (id)
a.value = lotsOfWork()
a.save()
}
Credo che la mancanza di salvataggio è una falsa pista, come ho cercato avvolgendo il sistema operativo in una transazione, e quindi ottenere un errore che dice ' DomainClass.withTransaction (Closure) "non è definito.
sembra che ci potrebbe essere una condizione di competizione in cui il primo lavoro non riesce a correre, ma tutti i seguenti posti di lavoro eseguito con successo dopo (qualcosa?) ha terminato l'avvio.
A che punto egli int Grails ciclo di vita stanno iniziando i lavori? Suona come è che si verificano prima che i domini sono stati decorati con i loro metodi dinamici ecc –
I lavori sono stati attivati da un'azione di controllo (per ora), quindi è bene dopo i domini sono stati decorati. Devo notare che se richiamo tutti i lavori dal thread principale, non si verificano problemi. – Akusete
bene, per me GORM è "attaccato" dal momento che propone save (Map) come una possibile soluzione. Puoi mettere la linea dove stai usando save. BTW colore è false per impostazione predefinita, il che significa che saranno svuotati al termine della sessione di Hibernate ... – fixitagain