发表于: 2017-06-13 16:23:59
2 1174
今天完成的事情:
1、将服务端系统中的Service中拆分出来,变成一个RMI的Service。想拆几个拆几个。
过程是这样的:
起先,我挑了一个任务7学员报名系统中的service、打算将它们发布成 RmiServiceExporter 类,但是在客户端调用时会100%报错。报错就是以下这种:
我就是按照各种教程的步骤来的。 (各种教程的步骤无非是那么几步。英文的springRMI文档我也看了,spring集成 rmi 远程调用是看到了,但看到hessian部分我就撤了)。
教程上说明的步骤:
<-------服务端开始--------->
第一步:写个配置文件,将项目中的某个service发布成 RmiServiceExporter 。
之后将这个配置文件import 入 applicationContext.xml 中。
service是对真实类的引用。
serviceName 是用在
rmi://localhost:7777/rmiTestService
中端口号斜杠后面那个。
serviceInterface 是指定想被远程调用的那个接口类的路径。
registryPort 是服务注册端口。默认为1099。
<bean id="studentService" class="com.jn.service.impl.StudentServiceImpl" />
<bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="studentService" />
<property name="serviceName" value="studentService" />
<property name="serviceInterface" value="com.jn.service.StudentService" />
<property name="registryPort" value="7777" />
</bean>
第二步:
服务端写一个main方法,然后在这个main方法中调用函数:
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
System.out.println("RMI服务伴随Spring的启动而启动了.....");
<-------服务端 结束-------->
<-------客户端 开始-------->
第三步:首先我在客户端的pom文件中添加了对服务端的依赖。
(如果没有maven。那就将服务器端的接口和接口实现类打成jar文件(或者直接将服务器端接口和接口实现类直接拷到应用中), 添加到应用中,然后添加相关Spring的jar。)
将服务器端的接口和接口实现类打成
jar
文件
(
或者直接将服务器端接口和接口实现类直
接拷到应用中
),
添加到应用中
,
然后添加相关
Spring
的
jar )
在客户端的spring配置文件中加上远程调用的那个服务。
<bean id="studentService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:7777/studentService"/>
<property name="serviceInterface" value="com.jn.service.StudentService"/>
</bean>
第四步:同样写个main方法:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("rmi-client.xml");
RmiService service = (RmiService) context.getBean("studentService");
第五步:启动main方法,查看报错
<-------客户端结束-------->
一次一次的尝试之后的报错让我很崩溃。改注册端口号,localhost改127.0.0.0改本地ip都试过。
然后我在服务端新写了个service,就是下面这样。形式和上一个任务中的service一样,有个@resource的mapper类,有个crud之一的方法。
@Service
public class RmiServiceImpl implements RmiService {
@Resource
private StudentMapper studentMapper;
@Override
public String doWork() {
return "这条信息是由服务器返回的。";
}
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public Student selectById(Long id) {
return studentMapper.selectByPrimaryKey(id);
}
}
然后在客户端调用。
很兴奋。
于是我又回去调用服务端其他的service。依旧报错。
我真是奇了怪了,服务端的那些service是怎么样的呢?
不也是实现类带上@service注解,有一个@autowired的mapper类。方法里是操作数据的。
为什么会失败呢?
明天计划的事情:
1、自己另外建一个task8项目。
把所有的dao、models、util都放到service端,把jsp页面和controller类放到client端,把util类中所有要用到的方法都做好接口放到client端。
遇到的问题:
1、从一接触任务8的这个远程方法调用的框架开始,思维就凌乱了。
收获:
评论