我们使用以下技术堆栈开发了一个应用程序:
Struts 2.1
Springs 3.1
Groovy 1.8
Tomcat 6.0.26 - For deployment
我们的要求是将应用程序的特定层迁移到 Groovy。我们已经将该层迁移到 groovy 并且应用程序运行良好。迁移 groovy bean 后由 spring 容器正确初始化,但我们无法利用 Groovy 的“动态语言”功能。也就是说,当我们修改 Groovy 脚本时,更新的更改不会动态地反映回应用程序。
作为参考,我附上了一个 groovy 脚本的方法(GroovyConnection.groovy):
@Component
class GroovyConnection implements EndPointManager, Serializable{
private static final long serialVersionUID = 1481681752777429674L;
private final static Logger log = Logger.getLogger(GroovyConnection.class);
private static final String DESTINATION_DIR = ARTIFACT_DIR_PATH.toString()+"/";
private static final String JIVE_USER = ""; //"jivescpt";
/**
* @param default
*/
public GroovyConnection() {
super();
jschInstance = new JSch();
}
public String executeCommands(Session session, String inputCommand, Device device) {
log.info("Entering executeCommand() device:" + inputCommand);
Channel channel = null;
PipedOutputStream commandIO = null;
InputStream sessionInput = null;
InputStream sessionOutput = null;
InputStream sessionError = null;
String commandResponse = null;
try {
channel = session.openChannel("shell");
commandIO = new PipedOutputStream();
sessionInput = new PipedInputStream(commandIO);
channel.setInputStream(sessionInput);
sessionOutput = channel.getInputStream();
sessionError = channel.getExtInputStream();
channel.connect();
return fireCommandsOnTerminal(session, commandIO, sessionOutput, sessionError, inputCommand, device);
}
catch (JSchException e) {
log.error(AutomationConstants.ERROR_MSG.toString(), e);
}
catch (IOException e) {
log.error(AutomationConstants.ERROR_MSG.toString(), e);
}
catch (InterruptedException e) {
log.error(AutomationConstants.ERROR_MSG.toString(), e);
}
finally {
boolean isClosed = GroovyConnectionHelper.closeAll(session, channel, commandIO, sessionInput, sessionOutput, sessionError);
if (!isClosed) {
return AutomationUtils.getPropertyValue("jive.vpn.error.msg");
}
}
log.info("Exiting executeCommand() device:" + inputCommand);
return commandResponse;
}
}
Groovy 上下文文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd">
<lang:defaults refresh-check-delay="2000"/>
<lang:groovy id="endPointManager"
script-source="classpath:GroovyConnection.groovy" refresh-check-delay="1000">
</lang:groovy>
</beans>
即使在给定 1 秒的刷新检查延迟时间之后,groovy bean 在运行时也没有相应地表现。我必须重新启动 Tomcat 才能重新部署更新的 groovy 更改。看起来应用程序将 groovy bean 视为 java bean。
除此之外,如果我在不使用 Springs 的情况下执行 groovy 脚本,它会按预期执行。修改后的 groovy 脚本更改会动态反映回来。这是供参考的代码:
常规脚本:
package com
public class test1 {
def hello_world() {
println "Connectddded"
}
}
主类:
public static void main(String arg[]) {
try {
new GroovyShell().parse(newFile("test1.groovy")).invokeMethod("hello_world", null);
} catch (CompilationFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
根据我的理解,我们在 Spring-Groovy 集成配置中遗漏了一些允许我们刷新 Groovy bean 修改的内容,或者 Tomcat 不允许我们刷新更新的 groovy 脚本。
如果有人可以就此提供任何建议会有所帮助。提前致谢。
问候, Divya Garg