使用telnet连接到基于spring的应用上执行容器中的bean的任意方法

使用telnet连接到基于spring的应用上执行容器中的bean的任意方法

使用telnet连接到基于spring的应用上执行容器中配置的任何bean的任意方法,可以用来诊断某个方法是否执行有问题,响应时间多少,在生产环境中可以很好的定位及监控方法是否存在问题。

代码在:https://github.com/zhwj184/springInvokemonitor

	git clone [email protected]:zhwj184/springInvokemonitor.git 

	maven clean install

pom依赖:

	<dependency>
		<groupId>org.zhwj184</groupId>
		<artifactId>springinvokemonitor</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
	
使用方式,在spring的配置文件中添加下面这个bean即可。

	<bean id="ServiceInvokeClient" class="org.zhwj184.ServiceInvokeClient" />
	
使用示例:先写一个service TestBean,里面有两个方法,add和addBean

	import 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" class="org.zhwj184.TestBean" />
	<bean id="ServiceInvokeClient" class="org.zhwj184.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 server
	cd : [ cd /usr/local]
	pwd: displays the working directory
	ls: displays list of files in the working directory
	mkdir : [ mkdir /usr/local/tmp]
	exit : quit this programme

	ls testBean
	org.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.4
	run time: 0ms

	invoke 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的任意方法,执行方法,看看返回结果是否跟预期的一致。一般生产环境跟测试环境很多依赖条件(数据库,服务等)都不一样,所以线上出现问题一般都可以知道参数,通过执行方法就可以看看结果是否正确,并且查看某个方法的执行时间来看方法是否有性能问题。

不过这里的代码只是简单做个示例,代码中关于参数的类型,结果匹配反射等可能不够完善也没有测试得很充分,有问题有兴趣的环境反馈给我。

相关推荐