每次我重新启动应用程序时,我都会对Grails域类的动态方法有一个MissingMethodException。
我有3个班级:
Manager.groovy:该类包含一个Java ScheduledThreadPoolExecutor和一个创建Worker的init方法,并将这些Worker提交给执行者。
Worker.groovy:实现Runnable并调用Domain动态方法。例如:MyDomain.get()
Bootstrap.groovy:在init方法中我调用了manager.init()
有时工人在域上调用动态方法,我得到了MissingMethodException。
知道怎么解决吗?
谢谢
答案 0 :(得分:1)
让你的Worker
课程extend
Thread
(或者让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类加载器已经加载了与运行时元编程相关的特殊Groovy类,比如关联元类和调用虚方法。你的ThreadPoolExecutor
可能会使用另一个不知道Groovy“魔法”的新鲜的类加载器。