最近研究JAVA的远程调用机制RMI,发现用纯JAVA方式调试痛苦无比,后来发现Spring的解决方案非常,但网上写的东西大多不完整,自己调试也是费了百般周折,以下是我写的例子,供大家参考使用.
1.新建服务器端JAVA工程SpringServer:
a.添加spring相应的jar包,注意一定要添加commons-logging和spring-remoting两个包
b.在工程里新建一个server包(主要是方便管理,名字可任取)
c.在server包下新建一个调用的接口类Calculator,注意这个接口类在客户端也应存在
package server;
public interface Calculator {
public String sayhello();
}
d.在server包下新建接口Calculator的实现类CalculatorImpl
package server;
public class CalculatorImpl implements Calculator{
@Override
public String sayhello() {
// TODO Auto-generated method stub
return "hello,this is allen";
}
}
e.在server包下新建服务器端的测试类CalculatorServer
package server;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CalculatorServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("server start");
}
}
f.配置spring的applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="calculatorService" class="server.CalculatorImpl"></bean>
<!-- 服务器端设置 -->
<bean id="serviceExporter"
class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName">
<value>calService</value>
</property>
<property name="service">
<ref bean="calculatorService" />
</property>
<property name="serviceInterface">
<value>server.Calculator</value>
</property>
<property name="registryPort">
<value>2008</value>
</property>
</bean>
</beans>
2.新建客户端JAVA工程SpringClient:
a.与服务端一样,添加spring相应的jar包
b.在工程里新建一个client包
c.在client包下新建调用的接口类Calculator
package client;
public interface Calculator {
public String sayhello();
}
d.在client包下新建客户端的测试类CalculatorClient
package client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CalculatorClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Calculator calculator=(Calculator)context.getBean("calculatorService");
String output=calculator.sayhello();
System.out.println("why?"+output);
}
}
e.配置spring的applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- 客户端设置 -->
<bean id="calculatorService"
class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface">
<value>client.Calculator</value>
</property>
<property name="serviceUrl">
<value>rmi://localhost:2008/calService</value>
</property>
</bean>
</beans>
3.分别执行服务器端和客户端进行测试
a.执行服务器端CalculatorServer,输出
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
server start
b.执行客户端CalculatorClient
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
why?hello,this is allen