2010-11-11 83 views
0

每次我重新启动我的应用程序时,我都会对Grails域类的动态方法产生MissingMethodException。域类中的MissingMethod异常

我有3类:

Manager.groovy:那类包含一个Java的ScheduledThreadPoolExecutor和创建工人并提交这些工人执行人的init方法。

Worker.groovy:实现Runnable和调用Domain动态方法。例如:MyDomain.get()

BootStrap.groovy中:在init方法我呼吁域manager.init()

有时工人呼叫动力学方法,我得到了MissingMethodException。

任何想法如何解决它?

谢谢

回答

1

你让你的WorkerextendThread(或者,让new Thread(Runnable)装饰),然后通过Groovy的ContextClassLoader它:

Worker worker = new Worker() // extends Thread 
worker.setContextClassLoader(
    Thread.currentThread().getContextClassLoader()) 
manager.schedule(worker, ..) 

Thread worker = new Thread(new Worker()) 
worker.setContextClassLoader(
    Thread.currentThread().getContextClassLoader()) 
manager.schedule(worker, ..) 

原因: Groovy类加载器加载了与运行时metaprogrammi相关的特殊Groovy类例如关联元类和调用虚拟方法。你的ThreadPoolExecutor可能会使用其他新鲜的类加载器,它不知道Groovy的“魔术”。

+0

答案解释了一切。谢谢!! – Mike 2010-11-11 17:36:10