最近有个调接口的需求, 我用的Java 接口服务端用的 c++ .
先引入jar包 ice3.7.4 jar包
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>ice</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>icebox</artifactId>
<version>3.7.4</version>
</dependency>
然后在项目下新建目录slice, 配置一个.ice 的配置文件
因为是Java后台, 要下载一个ice的编译工具, 将.ice文件编译成Java代码. 下载链接我也忘了百度搜一下, 这个东西下载很慢.
安装好后,好像是自动配置环境变量的, 可以自己看看环境变量,没有就手动在PATH里配置一个.
slice2java -v 一下看看安装好了没
然后到.ice 的文件所在目录下 打开CMD,输入编译命令 slice2java .\MyIce.ice --output-dir ..\..\src\main\java
他会自动编译出对应的Java代码在你的项目里, .ice配置里要配你的包名和文件名.
编写客户端调用接口的代码
//初始化容器
Communicator communicator = null;
// 初始化ice通信器 设置超时时间
communicator = Util.initialize();
// 传入远程服务单元的ice对象标识符
ObjectPrx objectPrx =
communicator.stringToProxy("QUER_Controller:default -h 127.0.0.1 -p 10006");
// 检验是否连接上
MyIcePrx myIcePrx = MyIcePrx.checkedCast(objectPrx);
if(myIcePrx==null){
System.err.println("未连接上");
}
//传参调用方法
String response = myIcePrx.sayMyIce(jsonObject.toJSONString());
//响应
System.out.println("接收成功:"+response);
编写服务端暴露接口代码
接口的实现类
package com.nanyang.service.impl;
import com.nanyang.bean.FuseRule;
import com.nanyang.rain.MyIce;
import com.zeroc.Ice.Current;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Arlen
* @Description
* @Date 2020/9/20 14:27
*/
@Service
@Transactional
public class MyIceImpl implements MyIce {
private Logger log = Logger.getLogger(this.getClass().getSimpleName());
@Override
public String sayMyIce(String jsonstr, Current current) {
log.info("ice的具体实现已被调用...."+jsonstr);
return "Hello_ice: ";
}
}
main方法
public static void main(String[] args) throws Exception{
int state = 0;
Communicator communicator = null;
try {
// 初始化ICE通信器communicator,可以使用args传入ice初始化的参数,如:超时时间、线程池的大小等
communicator = Util.initialize(args);
// 撞见一个名为queryEmployeeAdapter的适配器 并且默认使用tcp协议 部署在10.0.0.1机器上 服务开启10006监听端口
ObjectAdapter adapter = communicator.createObjectAdapterWithEndpoints("queryServer", "default -h 127.0.0.1 -p 10006");
// 创建服务端代码实现实现类
MyIceImpl myIce = new MyIceImpl();
// 将服务端实现类与ice对象标识符简历映射关系,并添加到ice对象适配器中
adapter.add(myIce, Util.stringToIdentity("QUER_Controller"));
// 激活对象适配器
adapter.activate();
System.out.println("queryServer已经激活");
// 服务在退出之前一直保持监听状态
communicator.waitForShutdown();
} catch (Exception e) {
state = 1;
System.out.println(e);
e.printStackTrace();
}finally {
if (communicator != null) {
communicator.destroy();
}
}
System.out.println("state:" + state);
}
记录一下自己的工作经验.