一、服务端配置
@Configuration
public class RmiConfiguration implements InitializingBean {
@Value("${app.rmi.registryPort}")
private int registryPort;
@Value("${app.rmi.servicePort}")
private int servicePort;
@Resource private IWorkflowEndPoint workflowPoint;
// 注册rmi服务端,通过该IWorkflowEndPoint接口来访问,在接口中定义方法
@Bean
public RmiServiceExporter workflowPointExporter() {
return export(IWorkflowEndPoint.class, workflowPoint, "flow");
}
private RmiServiceExporter export(Class<?> serviceInterface, Object instance, String instanceName) {
RmiServiceExporter exporter = new RmiServiceExporter();
exporter.setServiceInterface(serviceInterface);
exporter.setService(instance);// 接口类
exporter.setServiceName(instanceName);//服务名称,对应客户端拼接访问路径
exporter.setRegistryPort(registryPort); //注册端口
exporter.setServicePort(servicePort); //通讯端口
return exporter;
}
@Override
public void afterPropertiesSet() {
log.info("--------------RMI Server started@RegistryPort[{}], ServicePort[{}] ---------------------", registryPort, servicePort);
}
}
二、对应的客户端配置
@Configuration
public class WorkflowRmiConfiguration {
@Resource private IRmiHostConfig rmiHostConfig;
// /flow对应服务端的服务名--》exporter.setServiceName(instanceName);//服务名
@Bean
public RmiProxyFactoryBean workflowEndpoint() {
return InitRmiProxyUtils.init(rmiHostConfig.getWorkflowUrl(), "/flow", IWorkflowEndPoint.class);
}
}
// 其中InitRmiProxyUtils工具类为:
@UtilityClass
public class InitRmiProxyUtils {
public static RmiProxyFactoryBean init(String serverUrl, String endpoint, Class<?> endpointInterface) {
RmiProxyFactoryBean factoryBean = new RmiProxyFactoryBean();
factoryBean.setRefreshStubOnConnectFailure(true);//连接丢失时尝试重连
factoryBean.setLookupStubOnStartup(false);//第一次调用时才开始查找生成stub
factoryBean.setServiceUrl(serverUrl + endpoint);// 访问地址
factoryBean.setServiceInterface(endpointInterface);// 访问的接口类
return factoryBean;
}
}
备注:
以上代码,客户端访问路径:rmi://127.0.0.1:2099/flow,该如何配置
服务端采用的配置类:RmiServiceExporter
客户端采用的配置类:RmiProxyFactoryBean