내 프로그램에서 "표현 평가자/엔진"으로 GroovyShell
을 사용하고 있습니다. 두 개의 입력을받습니다 : (a) 하나 이상의 초기화 스크립트 (b) 사용자 정의 스크립트. 그런 다음 둘 다 런타임시 큰 덩어리의 스크립트 (텍스트)로 연결되고 쉘에 공급됩니다.GroovyShell을 "Expression Evaluator/Engine"으로 사용 (또는 : GroovyShell 재사용 방법)
String initScripts = getFromDB()
String userScript = getFromUser()
def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)
위의 코드는 userScript
의 내용이 달라집니다 루프에서 실행됩니다.
지금까지 initScripts
은 userScript
(예 : print "$yyyy 001"
)에서 참조 할 수있는 변수 정의 (예 : def $yyyy = new Date().format('yyyy')
) 만 포함합니다.
더 효율적인 방법이 있습니까? (예 : 셸 재사용?) 지금은 이므로 매우입니다.
편집 : 그루비는 필수 항목입니다. 다른 스크립팅 엔진을 사용하지 않는 것이 좋습니다.
편집 : 나는 GroovyShell이 (의사 코드) 할 수 있는지 여부를 생각하고 있어요 :이게 가능
def shell = new GroovyShell()
shell.evaluate(initScripts)
for each userScript in DB {
shell.put(userScript)
def result = shell.evaluateThat()
println "Result is $result"
}
를? (내가 마지막으로봤을 때 가능하지는 않지만 틀렸으면 좋겠다.)
GroovyShell은 상태가없고 스레드로부터 안전합니까? 어떤 사람들은 다른 스크립트로 동시에 프로그램을 사용할 수 있습니다 (확실히'userScript'는 호출마다 사용자마다 다를 수 있기 때문에). – wiradikusuma
예 스레드 안전하며 상태 비 저장 (하지만 기본 생성자를 사용하지 않으면 방어 복사본을 만들지 않습니다. 문제가 될 수 있습니다.) http://svn.codehaus.org/groovy/ trunk/groovy/groovy-core/src/main/groovy/lang/GroovyShell.java – Adam
쉘 객체를 재사용 할 수 있다고 생각하지만 스크립트 객체를 재사용 할 수 없다고 생각합니다. 스크립트 인스턴스는 바인딩을 위해'Map'을 사용합니다. 이것은 스레드로부터 안전하지 않습니다. – HDave