Trong ứng dụng Grails của tôi, tôi đã cài đặt phần bổ trợ Quartz. Tôi muốn đánh chặn các cuộc gọi đến mọi phương thức của lớp công việc Thạch Anh 'execute
để thực hiện điều gì đó trước khi phương thức execute
được gọi (tương tự như AOP trước lời khuyên).Phương thức Groovy chặn
Hiện nay, tôi đang cố gắng để làm việc chặn này từ doWithDynamicMethods
đóng plugin khác như hình dưới đây:
def doWithDynamicMethods = { ctx ->
// get all the job classes
application.getArtefacts("Job").each { klass ->
MetaClass jobMetaClass = klass.clazz.metaClass
// intercept the methods of the job classes
jobMetaClass.invokeMethod = { String name, Object args ->
// do something before invoking the called method
if (name == "execute") {
println "this should happen before execute()"
}
// now call the method that was originally invoked
def validMethod = jobMetaClass.getMetaMethod(name, args)
if (validMethod != null) {
validMethod.invoke(delegate, args)
} else {
jobMetaClass.invokeMissingMethod(delegate, name, args)
}
}
}
}
Vì vậy, cho một công việc như
class TestJob {
static triggers = {
simple repeatInterval: 5000l // execute job once in 5 seconds
}
def execute() {
"execute called"
}
}
Nó nên in:
điều này sẽ xảy ra trước khi thực hiện()
thi hành c alled
Nhưng nỗ lực của tôi ở phương pháp đánh chặn dường như không có hiệu lực và thay vào đó nó chỉ in:
execute gọi
Có lẽ nguyên nhân của vấn đề là this Groovy bug? Mặc dù các lớp Job không thực hiện một cách rõ ràng giao diện org.quartz.Job
, tôi nghi ngờ rằng ngầm (do một số voodoo Groovy), chúng là các cá thể của giao diện này.
Nếu thực sự lỗi này là nguyên nhân của sự cố của tôi, có cách nào khác mà tôi có thể thực hiện "trước khi chặn phương pháp" không?
Tôi nghĩ bạn đã nhận thức được cách tiếp cận AOP nhưng muốn thay thế cho phương pháp này. :) – dmahapatro