Иногда возникает исключение 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 иногда перекомпилирует скрипт, даже если он вообще не был изменен.

0 ответов

Другие вопросы по тегам