使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法使用telnet连接到基于spring的应用上执行容器中配置的任何bean的任意方法,可以用来诊断某个方法是否执行有问题,响应时间多少,在生产环境中可以很好的定位及监控方法是否存在问题。代码在:https://github.com/zhwj184/springInvokemonitorgit clone git@github.com:zhwj184/springInvokemonitor.git maven clean installpom依赖:<dependency><groupId>org.zhwj184</groupId><artifactId>springinvokemonitor</artifactId><version>1.0-SNAPSHOT</version></dependency>使用方式,在spring的配置文件中添加下面这个bean即可。<bean id="ServiceInvokeClient" />使用示例:先写一个service TestBean,里面有两个方法,add和addBeanimport com.alibaba.fastjson.JSON;public class TestBean {public float add(int a, float b){return a + b;}public A addBean(A a, A b){A c = new A();c.setC(a.getC() + b.getC());c.setD(a.getD() + b.getD());return c;}public static void main(String[] args) {A c = new A();c.setC(23);c.setD(323.34);System.out.println(JSON.toJSON(c));}}class A{int c ;double d;public int getC() {return c;}public void setC(int c) {this.c = c;}public double getD() {return d;}public void setD(double d) {this.d = d;}}然后在spring配置文件 service.xml添加<bean id="testBean" /><bean id="ServiceInvokeClient" />写一个测试类,执行这个main方法,import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {/** * @param args * @throws InterruptedException */public static void main(String[] args) throws InterruptedException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:service.xml");Thread.sleep(100000000);}}然后通过telnet连到这个服务上,打开命令行窗口,输入telnet localhost 12667,连上之后,输入ls bean名称,即可查询这个bean的所有方法,使用invoke beanname.method(param1,param2) 执行某个方法,参数如果为bean则可以使用json格式传入,参数之间用;分隔====================================================== Welcome to Telnet Server: Version 1.0======================================================List of possible commands:Status: displays the status of the servercd : [ cd /usr/local]pwd: displays the working directoryls: displays list of files in the working directorymkdir : [ mkdir /usr/local/tmp]exit : quit this programmels testBeanorg.zhwj184.A org.zhwj184.TestBean.addBean(org.zhwj184.A,org.zhwj184.A)void org.zhwj184.TestBean.main([Ljava.lang.String;)float org.zhwj184.TestBean.add(int,float)int org.zhwj184.TestBean.hashCode()java.lang.Class org.zhwj184.TestBean.getClass()void org.zhwj184.TestBean.wait(long,int)void org.zhwj184.TestBean.wait()void org.zhwj184.TestBean.wait(long)boolean org.zhwj184.TestBean.equals(java.lang.Object)java.lang.String org.zhwj184.TestBean.toString()void org.zhwj184.TestBean.notify()void org.zhwj184.TestBean.notifyAll()invoke testBean.add(1;2.4)result:java.lang.Float 3.4run time: 0msinvoke testBean.addBean({"c":23,"d":323.34};{"c":3433,"d":3232433.34})result:org.zhwj184.A {"c":3456,"d":3232756.6799999997}run time: 0ms这样可以诊断spring容易中任何bean的任意方法,执行方法,看看返回结果是否跟预期的一致。一般生产环境跟测试环境很多依赖条件(数据库,服务等)都不一样,所以线上出现问题一般都可以知道参数,通过执行方法就可以看看结果是否正确,并且查看某个方法的执行时间来看方法是否有性能问题。不过这里的代码只是简单做个示例,代码中关于参数的类型,结果匹配反射等可能不够完善也没有测试得很充分,有问题有兴趣的环境反馈给我。
?