9

GroovyShellプログラム内で「式エバリュエーター/エンジン」として使用しています。次の2つの入力を受け入れます。(a)1つ以上のinitスクリプト(b)ユーザー定義スクリプト。次に、両方が実行時にスクリプト(テキスト)の大きなチャンクとして連結され、シェルにフィードされます。

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

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

上記のコードはループで実行され、内容userScriptは異なります。

これまでのところ、( eg )で参照される可能性のあるinitScripts変数定義(eg)のみが含まれています。def $yyyy = new Date().format('yyyy')userScriptprint "$yyyy 001"

これに対するより効率的なアプローチはありますか?(たとえば、シェルを再利用する方法は?)現在は非常に遅いためです。

編集: Groovyは必須です。他のスクリプトエンジンはお勧めしません。

編集: GroovyShellがこれを実行できるかどうかを考えています(擬似コード):

def shell = new GroovyShell()
shell.evaluate(initScripts)

for each userScript in DB {
    shell.put(userScript )
    def result = shell.evaluateThat()
    println "Result is $result"
}

これは可能ですか?(前回グーグルで検索することはできませんが、間違っているといいのですが)

4

3 に答える 3

7

GroovyShellをキャッシュできます。常に、新しいシェルを作成する必要はありません。

final static GroovyShell shell = new GroovyShell()

また、1つのスクリプトを何度も実行する場合は、それらもキャッシュできます。GroovyShell.parse(String scriptText)を使用Scriptしてを作成し、 Script.run ()を使用してスクリプトを実行できます。

ドキュメントのこのセクションも役立つ場合があります。スクリプトの代わりに、Groovyオブジェクトを動的に作成することもできます。

于 2011-03-16T19:25:03.977 に答える
1

毎回完全なグルーヴィーな環境を構築することの重さを避けることができると思います。

Java 6以降、JavaにはスクリプトAPIがサポートされており、軽量のスクリプトエンジンを使用できます。

例として、を使用してJavaアプリケーションでgroovyスクリプトを開始する方法を説明しているgroovyWebサイトのこのページをGroovyScriptEngineImpl参照してください。

Groovyブドウのように、Groovyの良さを失う可能性があることに注意してください。ただし、

  • スクリプトエンジンを再利用する
  • スクリプトがアプリケーションコンテキストで評価されることを確認します(最終的にはJavaオブジェクトの使用によるメリットがあります)

注意すべき重要なことの1つを編集すると、Groovyスクリプトは任意の数のスレッドを自由に生成できるため、スレッドの安全性を保証することも、保証することGroovyScriptEngineImplもできません。GroovyShell実際、スレッドの安全性を保証できる唯一の方法は、スレッド操作を禁止するSecurityManagerをインストールすることです。実際、それでもスレッドセーフは保証されません(このスレッドセーフは、すべてのJavaコードベースがスレッドセーフであることを確認することによってのみ達成できるため)。

于 2011-03-16T09:29:40.623 に答える
0

私はこれを行うことになります:

def shell = new GroovyShell()
shell.evaluate(initScripts)

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

そして、安全のために、あなたは入れたりプールshellしたりすることができます。ThreadLocal

于 2011-03-17T06:09:26.043 に答える