2011-06-27 22 views
1

我在Apache JMeter中使用Quercus進行簡單的測試腳本編寫。我有一個使用log4j從PHP登錄的要求,總的來說,這很好。所以我寫了一個櫟模塊是這樣的:在Java ScriptEngine中使用Quercus時,如何註冊Quercus自定義函數?

public class LogFunction extends AbstractQuercusModule { 

    private static Logger log = Logger.getLogger(LogFunction.class); 

    public void log_str(Env env, String str) { 
     log.info(str); 
    } 
} 

現在,我用下面的代碼測試此:

公共類QuercusTest {

private static ScriptEngine engine; 

static{  
    //set up Quercus 
    ScriptEngineManager manager = new ScriptEngineManager(); 
    engine = manager.getEngineByName("php"); 
} 

public static void main(String[] args) throws ScriptException{ 
    engine.eval("<?php log_str('Hello');"); 
} 

}

這將引發異常(如我所料),因爲這個自定義函數沒有註冊。

Exception in thread "main" com.caucho.quercus.QuercusErrorException: eval::1: Fatal Error: 'log_str' is an unknown function. 
    at com.caucho.quercus.env.Env.error(Env.java:6420) 
    at com.caucho.quercus.env.Env.error(Env.java:6306) 
    at com.caucho.quercus.env.Env.error(Env.java:5990) 
    at com.caucho.quercus.expr.CallExpr.evalImpl(CallExpr.java:198) 
    at com.caucho.quercus.expr.CallExpr.eval(CallExpr.java:151) 
    at com.caucho.quercus.expr.Expr.evalTop(Expr.java:523) 
    at com.caucho.quercus.statement.ExprStatement.execute(ExprStatement.java:67) 
    at com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:413) 
    at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:134) 
    at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:179) 
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247) 
    at com.succeed.QuercusTest.main(QuercusTest.java:18) 

但是,我看不到如何使用Java腳本引擎註冊此Quercus模塊。文件有點稀疏...任何幫助,將不勝感激。

回答

3

1.

ScriptEngineManager manager = new ScriptEngineManager(); 
engine = manager.getEngineByName("php"); 

2.

if(engine instanceof QuercusScriptEngine) 
{ 
    ((QuercusScriptEngine)engine).getQuercus().addModule(new LogFunction()); 
} 

這工作。 (quercus-4.0.18-src + resin 4.0)

+0

謝謝。看起來像我正在尋找的答案 –

0

我結束了開溝腳本引擎代碼,並融入本土櫟:

QuercusEngine engine = new QuercusEngine(); 
engine.getQuercus().getModuleContext().addModule("LogFunction", new LogFunction()); 
engine.setOutputStream(os); 
engine.getQuercus().init(); 
engine.execute(phpCode); 

該工程確定。它至少有相當可預見的行爲。