RMI是java提供的一种远程调用应用服务方式,由于是依赖于JVM,因此仅支持java应用之间的调用。
实现思路其实也比较简单,服务端提供接口,客户端实现并注册到指定端口,服务端通过获取接口的实现bean进行调用。具体代码如下,亲测可行:
1.服务端提供接口
package com.chinacreator.c2.msgcenterqueue;
import com.alibaba.fastjson.JSONObject;
import com.chinacreator.c2.common.Result;
import java.util.List;
/**
* 邮件发送接口
* @author wu.zeng
* @version 1.0
* @date 2020/11/4 14:11
*/
public interface IEmailSend {
/**
* 常规邮件发送
* @param params
* @return
*/
public Result sendEmail(List<JSONObject> params);
}
2.客户端实现接口
package com.kc.msg.consumer.msg;
import com.alibaba.fastjson.JSONObject;
import com.chinacreator.c2.common.Result;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmailSend implements com.chinacreator.c2.msgcenterqueue.IEmailSend{
@Override
public Result sendEmail(List<JSONObject> params) {
return Result.OK("嘿,邮件服务调用成功了呢");
}
}
3.客户端接口实例注册(注意注册端口与服务名与服务端统一)
@Bean
public RmiServiceExporter RmiServiceExporter() {
RmiServiceExporter exporter = new RmiServiceExporter();
exporter.setService(service);
exporter.setServiceName("sendEmail");
exporter.setServiceInterface(IEmailSend.class);
exporter.setRegistryPort(8083);//注意这里必须是注册端口
try {
exporter.afterPropertiesSet();
} catch (RemoteException e) {
e.printStackTrace();
}
return exporter;
}
4.服务端注册 RmiProxyFactoryBean对象
@Bean
public RmiProxyFactoryBean rmiProxyFactoryBean() {
RmiProxyFactoryBean bean = new RmiProxyFactoryBean();
bean.setServiceUrl("rmi://127.0.0.1:8083/sendEmail");
bean.setServiceInterface(IEmailSend.class);
bean.setRefreshStubOnConnectFailure(true);
return bean;
}
5.服务端调用
@Autowired
RmiProxyFactoryBean rmiProxyFactoryBean;
IEmailSend emailSend = (IEmailSend) rmiProxyFactoryBean.getObject();
Result result = emailSend.sendEmail(paramList);
System.out.println(result.getData());
6.成功