发表于: 2020-07-16 23:10:05

1 1578


今天完成的事情:

学习SpringRMI:

SpringRMI和昨天的RMI大致类似,不过简化了许多:

服务端需要接口和实现类,使用SpringRMI不需要实现Remote接口,该接口的方法也不用抛出异常,基本就是个普通的接口。

首先写一个接口:

package SpringRmi;

public interface Hello {
void sayHello();
}

然后是接口实现类:

package SpringRmi;

public class HelloImpl implements Hello {

public void sayHello() {
System.out.println("Hello SpringRmi!");
   }
}


服务器启动程序

package SpringRmi;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloServer {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       System.out.println("SpringRmi Server is ready.....");
   }
}

配置spring的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.xsd">

   <!-- RMI服务端 -->
   <!-- RMI服务端远程接口实现类 -->
   <bean id="helloImpl" class="SpringRmi.HelloImpl" scope="prototype"/>
   <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
       <!-- 将远程接口实现类对象设置到RMI服务中 -->
       <property name="service" ref="helloImpl"/>
       <!-- 设置RMI服务名,为RMI客户端依据此服务名获取远程接口实现类对象引用奠定基础 -->
       <property name="serviceName" value="Hello"/>
       <!-- 将远程接口设置为RMI服务接口 -->
       <property name="serviceInterface" value="SpringRmi.Hello"/>
       <!-- 为RMI服务端远程对象注册表设置端口号-->
       <property name="registryPort" value="1099"/>
   </bean>


</beans>



客户端:

客户端也需要一个对应的接口:

public interface Hello {
void sayHello();
}

客户端启动程序:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class RMIClient {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       Hello hello = (Hello)context.getBean("rmiProxyFactory");
       hello.sayHello();
   }
}

客户端也要配置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.xsd">

   <!--RMI客户端-->
   <bean id="rmiProxyFactory" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
       <property name="serviceUrl" value="rmi://localhost:1099/Hello"/>
       <property name="serviceInterface" value="Hello"/>
       <!--当连接失败时是否刷新远程调用stub-->
       <property name="refreshStubOnConnectFailure" value="true"/>
   </bean>
</beans>

先启动服务器文件:

再启动客户端程序之后:


接下来将之前项目的报名系统拆分。

直接在服务端xml配置文件中添加:

<!-- RMI服务端 -->
<!-- RMI服务端远程接口实现类 -->
<bean id="accountServiceImpl" class="com.jnshu.service.AccountServiceImpl" scope="prototype"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!-- 将远程接口实现类对象设置到RMI服务中 -->
   <property name="service" ref="accountServiceImpl"/>
   <!-- 设置RMI服务名,为RMI客户端依据此服务名获取远程接口实现类对象引用奠定基础 -->
   <property name="serviceName" value="AccountServiceImpl"/>
   <!-- 将远程接口设置为RMI服务接口 -->
   <property name="serviceInterface" value="com.jnshu.service.AccountService"/>
   <!-- 为RMI服务端远程对象注册表设置端口号-->
   <property name="registryPort" value="1099"/>
</bean>

然后启动程序:

package com.jnshu.Rmi;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Server {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       System.out.println("Rmi Server is ready.....");
   }
}


然后新建了个项目来模拟客户端:

<?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.xsd">

   <!--RMI客户端-->
   <bean id="rmiProxyFactory" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
       <property name="serviceUrl" value="rmi://localhost:1099/AccountServiceImpl"/>
       <property name="serviceInterface" value="Test.AccountService"/>
       <!--当连接失败时是否刷新远程调用stub-->
       <property name="refreshStubOnConnectFailure" value="true"/>
   </bean>
</beans>

启动程序:

package Test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestClient {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:test.xml");
       AccountService accountService =(AccountService)context.getBean("rmiProxyFactory");
       System.out.println(accountService.selectAccount("root"));
   }
}

这里有几个点要注意:

首先是接口返回的是Account类,这个类在客户端也需要有,而且要序列化(实现Serializable接口)。

分别启动测试一下:

可以看到成功调用了。


接下来要做的就简单了,只需要像这样把其他所有接口都加进去就可以了。


收获:初步学会SpringRmi的使用方法。


明天计划完成的事情:
将学员系统的service拆分出来。


返回列表 返回列表
评论

    分享到