2011-03-16 4 views
7

내 프로그램에서 "표현 평가자/엔진"으로 GroovyShell을 사용하고 있습니다. 두 개의 입력을받습니다 : (a) 하나 이상의 초기화 스크립트 (b) 사용자 정의 스크립트. 그런 다음 둘 다 런타임시 큰 덩어리의 스크립트 (텍스트)로 연결되고 쉘에 공급됩니다.GroovyShell을 "Expression Evaluator/Engine"으로 사용 (또는 : GroovyShell 재사용 방법)

String initScripts = getFromDB() 
String userScript = getFromUser() 

def shell = new GroovyShell() 
output = shell.evaluate(initScripts + userScript) 

위의 코드는 userScript의 내용이 달라집니다 루프에서 실행됩니다.

지금까지 initScriptsuserScript (예 : 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" 
} 

를? (내가 마지막으로봤을 때 가능하지는 않지만 틀렸으면 좋겠다.)

답변

7

당신은 GroovyShell을 캐시 할 수 있습니다, 당신은 항상 새로운 하나를 만들 필요가 없습니다 :

final static GroovyShell shell = new GroovyShell() 

을 하나 스크립트를 여러 번 실행 또한 경우에 당신도 그들을 캐시 할 수 있습니다. ScriptGroovyShell.parse(String scriptText)으로 만들고 Script.run()을 사용하여 스크립트를 실행할 수 있습니다.

도 도움이 될 수 있지만 스크립트 대신 Groovy 객체를 동적으로 만들 수도 있습니다.

+1

GroovyShell은 상태가없고 스레드로부터 안전합니까? 어떤 사람들은 다른 스크립트로 동시에 프로그램을 사용할 수 있습니다 (확실히'userScript'는 호출마다 사용자마다 다를 수 있기 때문에). – wiradikusuma

+1

예 스레드 안전하며 상태 비 저장 (하지만 기본 생성자를 사용하지 않으면 방어 복사본을 만들지 않습니다. 문제가 될 수 있습니다.) http://svn.codehaus.org/groovy/ trunk/groovy/groovy-core/src/main/groovy/lang/GroovyShell.java – Adam

+0

쉘 객체를 재사용 할 수 있다고 생각하지만 스크립트 객체를 재사용 할 수 없다고 생각합니다. 스크립트 인스턴스는 바인딩을 위해'Map'을 사용합니다. 이것은 스레드로부터 안전하지 않습니다. – HDave

1

매번 그루비 넘치는 환경을 만들지 않아도된다.

Java 6부터 Java에서 스크립팅 API가 지원되므로 경량 스크립팅 엔진을 사용할 수 있습니다.

예를 들어 GroovyScriptEngineImpl을 사용하여 자바 응용 프로그램에서 그루비 스크립트를 시작하는 방법을 설명하는 this page in groovy website을 참조하십시오.

  • 결국 자바 객체에서 혜택을 애플리케이션 컨텍스트에서 스크립트 evals를 (확인 스크립트 엔진을 다시

    통지 당신은 어쩌면 그루비 포도와 같은 일부 끝내 goodnesses을 풀 수 있지만

    • 을 할 수 있습니다 사용)

    편집 주목할 하나 중요한 것은 GroovyScriptEngineImplGroovyShell도 당신에게 스레드 안전의 어떤 종류를 보장 할 수 있다는 것입니다, 그루비 스크립트는 임의의 수의 스레드를 자유롭게 생성 할 수 있기 때문에 실제로 스레드 안전을 보장 할 수있는 유일한 방법은 installing a SecurityManager입니다. 스레드 작업을 금지하는 것입니다. 사실, 심지어는 스레드 안전성을 보장하지 않습니다 (이 스레드 안전성은 모든 Java 코드 기반이 스레드 안전성을 보장함으로써 만 달성 될 수 있기 때문에).

  • +0

    내가 조사했지만 내 질문은 여전히 ​​동일합니다. 스레드로부터 안전합니까? 어떻게 다시 사용할 수 있습니까? (GroovyScriptEngineImpl을 사용한다면). – wiradikusuma

    +0

    죄송하지만 스레드 안전을 묻는 질문에 whre가 표시되지 않습니다. – Riduidel

    +0

    죄송합니다. 제 잘못이라고 명시 적으로 말하지 않았습니다 : P – wiradikusuma

    0

    나는이 일을 끝낼 :

    def shell = new GroovyShell() 
    shell.evaluate(initScripts) 
    
    for(i in 1..count) 
    { 
        output = shell.evaluate(userScripts); 
    } 
    

    그리고 안전을 위해, 당신은 ThreadLocal 또는 수영장에서 shell을 넣을 수 있습니다.

    관련 문제