Иногда возникает исключение GroovyCastException при использовании GroovyScriptEngine
Я разработал платформу (просто Java-приложение), которая может выполнять скрипты Groovy с указанным локальным путем (это означает, что скрипты и платформа находятся на одном компьютере, и моя платформа считывает скрипты с указанным путем)
Я использовал Groovy ScriptEngine для выполнения скриптов. Учитывая, что Groovy Script может зависеть от других скриптов Groovy, я думаю, что использование GSE(GroovyScriptEngine) является правильным выбором. Я использовал метод loadScriptByName для загрузки скрипта Groovy как класса, например:
@Override
public Class loadClassByScriptName(String scriptName) throws Exception {
try {
return groovyScriptEngine.loadScriptByName(scriptName);
} catch (ResourceException e) {
//not exists
return null;
}
}
параметр: scriptName - это полный путь скрипта на компьютере.
Проблема в том, что иногда возникало GroovyCastException, и я не знаю почему.
Более конкретно, у меня есть сценарий с именем MODEL, он просто POGO, расширяется с помощью POJO и участвует в других сценариях. Например:
MODEL.groovy
package cn.fraudmetrix.octopus.platform.script.entry.fund.cc360700.extra
import cn.fraudmetrix.octopus.platform.base.model.ordovician.OrdovicianModel
import cn.fraudmetrix.octopus.platform.spider.model.Task
import com.google.common.collect.Lists
class MODEL extends OrdovicianModel {
MODEL() {
}
MODEL(Task task) {
super(task)
}
private String zgzh
private String dwbm
private int page
private List<String> cxyd
Это МОДЕЛЬ, ничего особенного, а OrdovicianModel - это просто POJO(написано на Java)
И я использую МОДЕЛЬ в других скриптах. Например:
Login1.groovy
@Override
void doParse(Model model, HttpResponse response, Object customParam, CrawlerHelper crawlerHelper) {
MODEL md = (MODEL) model
//Model is the base class of the MODEL.
//do something with md.
}
Обычно работает нормально, проблем вообще нет. Однако иногда мне нужно изменить скрипты. Я знаю, что GSE обнаружит измененные файлы сценария и автоматически перекомпилирует его, и обычно это работает хорошо, но иногда оно вызывает исключение GroovyCastException, например:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'cn.fraudmetrix.octopus.platform.script.entry.fund.cc360700.extra.MODEL@788c8d54' with class 'cn.fraudmetrix.octopus.platform.script.entry.fund.cc360700.extra.MODEL' to class 'cn.fraudmetrix.octopus.platform.script.entry.fund.cc360700.extra.MODEL'
Я знаю причину, по которой эта проблема возникла из-за того, что MODEL был загружен различными внутренними загрузчиками классов, но это истинная проблема, потому что после того, как я проверил время последнего изменения файла MODEL, я обнаружил, что он намного раньше, чем выполнил его.
например, время последнего изменения MODEL - 2017-12-14, а время, которое я выполнил, - 2017-12-16, это означает, что GSE не должен перекомпилировать его, но возникла проблема, и я не знаю почему.
Подробнее , операционная система, на которой работает моя платформа, - CentOS 7, 64 бита. Эти сценарии будут выполняться постоянно, и сценарии будут изменены, когда это необходимо. Изменение сценариев означает, что я изменяю только содержимое сценария, и GSE определит время последнего изменения сценария, чтобы решить, следует ли его перекомпилировать автоматически.
Я не знаю, почему это произошло, и я не знаю, как воспроизвести эту проблему.(после сотен попыток я, наконец, сдаюсь.) Я долго изучал Интернет и до сих пор не нашел эффективных решений.
Итак, проблема в том, почему GSE иногда перекомпилирует скрипт, даже если он вообще не был изменен.