博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java rmi spring 4.0_Java Spring RMI一些尝试
阅读量:6409 次
发布时间:2019-06-23

本文共 2676 字,大约阅读时间需要 8 分钟。

最近在做一个调度服务器的项目,因为各个服务器上面的定时任务比较多,分别执行的话运维检查起来比较麻烦.就想到搞一个专门的调度服务器来统一管理这些任务.因为随时可能增加新的服务器或者新的命令,要是全写在一起每次要把整个程序替换掉,上线不方便.发现spring可以很好的解决这个问题,新加的程序可以以单独jar包的方式添加,只需要修改ApplicationContext就行了,client端只需要改配置就行了程序可以不用改.个人感觉spinrg自身的RMI类比Java自带的好理解一些.

首先是Server端,需要有一个启动函数,以及各命令对应的实现接口,启动类 .为了部署方便期间,配置文件路径直接改外部输入了

public classStartRMIServer {public static voidstartRMIServer(String path) {if(path != null && path.startsWith("/")) {new FileSystemXmlApplicationContext("/" + path + "applicationContext.xml");

}else{new FileSystemXmlApplicationContext(path + "applicationContext.xml");

}

System.out.println("RMI服务端启动!!!");

}public static voidmain(String[] args) {

startRMIServer(args[0]);

}

}

关于FileSystemXmlApplicationContext这里一开始不知道,在Linux下输入的根路径会被当成当前路径处理,去查了之后发现是构造函数会把第一个'/'给去掉,所以这里需要加上.也可以用ClassPathXmlApplicationContext直接以file:开头

然后加入接口和实现类,当客户端发起命令时就会调用该接口,接口对应的实现类由spring定义文件来控制,所以就能够实现不同的命令对应不同的实现类.这里定义了两个不同的实现类

public interfaceIRmiService{

String getMsg(String params)throwsException;

}

调用的类预留一个字符串参数,便于有需要的实现类解析后使用

public class HelloWordService implementsIRmiService{public String getMsg(String params) throwsException{return "Hello World!";

}

}public class RealTimeService implementsIRmiService {publicString getMsg(String params){return "Real Time!" +params;

}

}

ApplicationContext配置定义如下,两个实现类分别对应不同的命令

这样server端就配置完成了,可以直接启动试一下

client端相当于是每次给server发一个请求命令,server端接收到之后去执行对应的实现类.我这边实现类加了log4j功能,参数是context路径,命令和命令对应的参数

public classRMIClient {public static voidmain(String[] args) {

ApplicationContext ctx= new ClassPathXmlApplicationContext("file:" + args[0] + "/applicationContext.xml");

IRmiServer helloWord= (IRmiServer) ctx.getBean(args[1]);

LogBean log= (LogBean) ctx.getBean("log");

PropertyConfigurator.configure(log.getPath());

Logger logger= Logger.getLogger(RMIClient.class);

logger.info("Call " + args[1]);try{

String params= "";if (args.length > 2 && args[2] != null && !"".equals(args[2])) {

params= args[2];

}

logger.info(helloWord.getMsg(params));

logger.info(args[1] + " succeed");

}catch(Exception e) {

e.printStackTrace();

logger.error(e.getMessage(), e);

System.exit(1);

}

}

}

接口名字其实不需要和server端一样

public interfaceIRmiServer{

String getMsg(String params)throwsException;

}

spring设置如下,这里设置了两条命令helloWorld和printDate,分别对应类HelloWordService和RealTimeService

此时就可以执行client,可以看到如果输入的命令不同,打印出的结果是不同的,说明调用的实现类不同.

部署的时候采用命令行指定java.ext.dirs的方式,这样可以把所有相关的程序jar包都放到文件夹里面,便于后续扩展程序的部署.

java -Djava.ext.dirs="rmiclient/lib" -jar rmiclient/rmiclient.jar D:/test/rmiclient printDate

关于后续添加部署.我现在想要添加一个程序,那么应该把这个jar包放置到server上的lib目录中,把server进程结束,然后在server的ApplicationContext增加一组bean,client的ApplicationContext也对应增加一组,重启之后就可以使用新的程序了.

通过这个小工具的开发对spring工厂和IOC有了些了解,后面要多研究吃透spring

转载地址:http://elwra.baihongyu.com/

你可能感兴趣的文章
JQuery教程实例-年月日的级联菜单
查看>>
如何卸载Linux下的Apache?
查看>>
使用CMD实现批量重命名[转]
查看>>
ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合六:业务逻辑层
查看>>
java 实现二分查找法(转)
查看>>
Ubuntu 下面用ibus在opera中输入中文
查看>>
Android内存调试命令
查看>>
ios中图层的用法(1)
查看>>
图形图像处理-之-任意角度的高质量的快速的图像旋转 中篇 高质量的旋转...
查看>>
SQL利用CASE按分组显示合计
查看>>
jquery在选择器中使用变量及innerText问题(转载)
查看>>
Android自动测试之monkeyrunner工具
查看>>
JS基础知识
查看>>
Java7语法新特性
查看>>
Flex4_Tree组件1(添加、删除、展开、关闭、右键菜单)
查看>>
无限极分类
查看>>
java基础知识回顾之javaIO类---BufferedInputStream和BufferedOutputStream
查看>>
友好解决POI导入Excel文件行是不是为空
查看>>
PHP+七牛云存储上传图片代码片段
查看>>
【LeetCode】23. Merge k Sorted Lists
查看>>