RMI远程方法调用:适用于 客户端 调用 服务器 内的方法;(Kotlin 语言编写)
如果业务为二个服务器之间的通信,还是得用消息队列的形式,因为RMI 不适合 双向 调用
下面介绍RMI 的使用方法:
1,服务器端代码:
定义接口(此接口放入服务端和客户端公用的模块 或者打成jar给服务器/客户端使用)
interface RmiService { /**
* 订单发货
* @param saleItemId BTB订单项 itemId
* @param shipmentName 物流公司名称
* @param shipmentNumber 物流单号
*
*/
fun shippedSale(saleItemId: Long, shipmentName: String, shipmentNumber: String): RestResponse<Any>
}
定义实现类
@Service
class RmiServiceImpl : RmiService { @Autowired
private lateinit var supplierSaleService: SupplierSaleService /**
* 订单发货
* @param saleItemId BTB订单项 itemId
* @param shipmentName 物流公司名称
* @param shipmentNumber 物流单号
*
*/
override fun shippedSale(saleItemId: Long, shipmentName: String, shipmentNumber: String): RestResponse<Any> {
return supplierSaleService.shippedSale(saleItemId, shipmentName, shipmentNumber)
} }
注册RMI服务
@Component
class RegistryExporter { @Autowired
private lateinit var rmiService: RmiService @Bean
fun rmiServiceExporter(): RmiServiceExporter {
val exporter = RmiServiceExporter()
exporter.service = rmiService
exporter.serviceInterface = RmiService::class.java
exporter.setServiceName("SERVER_NAME")
exporter.setRegistryPort(RmiServiceConstants.REGISTRY_PORT)
return exporter
} }
2.客户端代码:
通过RMI代理实例化接口(即 服务器定义的接口)
@Bean("rmiService")
fun rmiService(): RmiProxyFactoryBean {
//创建rmi的代理
val rmiProxyFactoryBean = RmiProxyFactoryBean()
//访问rmi,ip,端口,和rmi名字
rmiProxyFactoryBean.serviceUrl = "rmi://${RmiServiceConstants.SERVER_HOST}:${RmiServiceConstants.REGISTRY_PORT}/" + RmiServiceConstants.SERVER_NAME
//设置代理类代理的接口
rmiProxyFactoryBean.serviceInterface = RmiService::class.java
return rmiProxyFactoryBean
}
调用接口
@Autowired
private lateinit var rmiService: RmiService fun test(){
rmiService.addSupplierSale(saleId)
}