Aku*_*ete 5 grails groovy hibernate
我正在尝试在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
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyThreadFactory创建在线程持续时间内附加了hibernate会话的线程.
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()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作,但是我第一次运行批处理作业时会出现以下错误.(后续工作无故障运行)
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 ...
Run Code Online (Sandbox Code Playgroud)
我试过用MyDomainClass.withNewSession {}替换persitanceInterceptor ,没有任何效果.
好像GORM方法没有被注入到我的域类中.
任何人都可以看到我做错了什么,为什么再次运行批处理作业可以让它成功?
@fixitagain为了完整性,工作采用以下形式:
doSomeWork = { id ->
MyDomainClass a = MyDomainClass.findById (id)
a.value = lotsOfWork()
a.save()
}
Run Code Online (Sandbox Code Playgroud)
我相信丢失的保存是一个红色的鲱鱼,因为我尝试在事务中包装操作,然后得到一个错误,说"DomainClass.withTransaction(Closure)"没有定义.
看起来可能存在竞争条件,其中第一个作业无法运行,但所有后续作业在(某些?)完成启动后成功运行.
与其尝试创建自己的线程,不如使用 Grails 的执行器插件。它将必要的休眠会话注入到您创建的线程中,而且它还可以根据它使用的执行器、线程数量等进行配置。我在生产中使用它来处理石英作业和其他场景,它工作得很好。
Grails Executor Plugin 如果你对使用它有保留的话,你可以在编写自己的线程策略之前看一下它的代码。
| 归档时间: |
|
| 查看次数: |
3537 次 |
| 最近记录: |