话说这个remote shell是个人最喜欢的功能,但是在新版本的spring boot 已经移除了对他的支持,很可惜,不过在新版本中也可以自己引入支持。那我们就着眼于眼前,毕竟我们教程中的版本是还没有移除的。这个remote shell是基于CRaSH,他可以再应用程序中开启端口,默认是2000,我们可以连进正在运行的程序中,达到监控与维护的目的。比如说,我们希望一个正在运行的程序中,某个Bean通过人为的操作下Destroy或者动态的数据订正之类的,都可以通过这个功能实现。
闲话不多说,我们看下pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
spring-boot-starter-remote-shell 这个模块主要就是将crash引入进来。然后我们在配置文件中定义用户名与密码:
shell.auth.simple.user.name: root
shell.auth.simple.user.password: root
剩下的我们可以使用groovy写一个获取spring 容器中Bean的脚本
package crash.commands
import org.crsh.cli.Command
import org.crsh.cli.Option
import org.crsh.cli.Usage
import org.springframework.beans.factory.support.DefaultListableBeanFactory
class yd {
@Usage("get bean from context")
@Command
Object get(@Option(names = ["n", "beanName"]) String beanName) {
def attrs = (DefaultListableBeanFactory) context.attributes["spring.beanfactory"];
if (beanName != null && !"".equals(beanName.trim())) {
return attrs.getBean(beanName)
}
return null;
}
}
这个脚本放置的位置一般情况下放到resources/commands目录下,因为在jar包中定义了脚本扫描的路径。我们就算配置好了,下面我们需要启动项目,启动成功后,打开shell界面,输入
ssh -p 2000 root@localhost
密码我们设置的也是
root
登录进来后的界面是
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.5.RELEASE) on oliferdeMacBook-Pro.local
进来后输入
repl groovy
进入groovy的操作模式,因为我们是使用groovy写的脚本,只有在这种模式下,脚本才能运行。
(yd.get{n='applicationMain'}|{t->t})()
返回值
com.shuqi.ApplicationMain$$EnhancerBySpringCGLIB$$97a5b16d@698e1763
说明我们已经获取到了这个Bean,然后我们可以操作这个Bean里面的方法来完成某些功能。这个真的是非常实用的。大家玩起来吧
下节将的内容是:SpringBoot基础教程(八)——与velocity的结合