由于项目需要,这几天开始接触ice,初次接触,除了一脸懵逼,还是一脸懵逼,对于一个入门小生来说,突然接触一个新的知识点,并且马上就要运用到项目中去,关键的是官方的文档还是英文的,在网上找的一些资源对于初次接触ice的人来说,并不能直观的运用到项目中去,经过这几天的摸索,终于成功的运用到项目中去了(虽然不清楚原理什么的),特写此博客,希望对像我一样初次接触的小白有所帮助。
多的不说了,上代码才是王道。
1.ice文件文件名为ServerIceZF.ice(此文件不是我写的,我老大写来给我,我直接调用接口):
#pragma once
#include <Ice/Identity.ice>
[["java:package:com.rain.service"]]
module Charge {
exception DatabaseException
{
string message;
};
class ChargeDetails {
["cpp:const"] idempotent string getOrder();
["freeze:write"] idempotent void setOrder(string order) throws DatabaseException;
["cpp:const"] idempotent double getAmt();
["freeze:write"] idempotent void setAmt(double amt);
["cpp:const"] idempotent int getResult();
["freeze:write"] idempotent void setResult(int result);
string order;
double amt;
int result;
};
class Psam {
["cpp:const"] idempotent string getPsamStr();
["freeze:write"] idempotent void setPsamStr(string psamStr) throws DatabaseException;
["cpp:const"] idempotent int getResult();
["freeze:write"] idempotent void setResult(int result);
string psamStr;
int result;
};
interface ServerIceZF
{
ChargeDetails* chargeRepeat(string order) throws DatabaseException;
Psam* resetPsam(string psamStr) throws DatabaseException;
};
};
2.写一个服务端,用于启动ice服务
package com.forwor.fwems.basemana;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Ice.Communicator;
import Ice.ObjectAdapter;
import Ice.Util;
import com.forwor.sysmana.ice.server.ServerIceZFI;
import com.forwor.util.log.ALogFactory;
@SuppressWarnings("serial")
public class ICESystemServlet extends HttpServlet {
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
new Thread(){
@Override
public void run() {
super.run();
Communicator ic = null;
int status = 0;
try{
ic = Util.initialize();
ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -h 127.0.0.1 -p 10000");
/*登录*/
Object obj = SpringContextHelper.getBean("loginI");
adapter.add((Ice.Object) obj, ic.stringToIdentity("loginAdapter"));
/*psam卡解绑*/
Object serverObj = SpringContextHelper.getBean("serverIceZFI");
adapter.add((Ice.Object) serverObj, ic.stringToIdentity("serverIceZFAdapter"));
adapter.activate();
ALogFactory.getLog().info("ICE服务器启动成功");
ic.waitForShutdown();
}catch(Exception e){
status = 1;
e.printStackTrace();
}finally{
if(ic != null){
ic.destroy();
ic = null;
}
}
System.exit(status);
}
}.start();
}
}
3.还有一个有main函数的服务端,两个有点类似,不知道有什么用,待后续研究
package com.forwor.sysmana.ice.server;
import Ice.Communicator;
import Ice.ObjectAdapter;
import Ice.Util;
public class Server {
public static void main(String[] args) {
Communicator ic = null;
int status = 0;
try{
ic = Util.initialize();
ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -h 127.0.0.1 -p 10000");
/*登录*/
Object loginObj = new LoginI();
adapter.add((Ice.Object) loginObj, ic.stringToIdentity("loginAdapter"));
/*解绑psam卡*/
Object serverObj = new ServerIceZFI();
adapter.add((Ice.Object) serverObj, ic.stringToIdentity("serverIceZFAdapter"));
adapter.activate();
ic.waitForShutdown();
}catch(Exception e){
status = 1;
e.printStackTrace();
}finally{
if(ic != null){
ic.destroy();
ic = null;
}
}
System.exit(status);
}
}
4.接下来就是调用的接口了,这个类需要实现ice编译的文件带Disp后缀的类,实现里面的方法,就是我需要调用的方法
package com.forwor.sysmana.ice.server;
import com.rain.service.Charge.ChargeDetailsPrx;
import com.rain.service.Charge.DatabaseException;
import com.rain.service.Charge.PsamPrx;
import com.rain.service.Charge._ServerIceZFDisp;
import Ice.Current;
@SuppressWarnings("serial")
public class ServerIceZFI extends _ServerIceZFDisp {
@Override
public ChargeDetailsPrx chargeRepeat(String order, Current __current)
throws DatabaseException {
// TODO Auto-generated method stub
return null;
}
@Override
public PsamPrx resetPsam(String psamStr, Current __current)
throws DatabaseException {
return null;
}
}
这个类我要调用的方法是
resetPsam();由于有一个返回值,所以之前就一直在纠结返回值的问题,不论你怎么写,都会报错(应该是我没写对),后面同事告诉我,调用这个方法参数传递进来就可以了,返回值不用管;然后果然是这样的,就这害得我搞了一上午。
5.接着就是在action里面写你要在jsp页面调用的方法了
public String unwrapPsam(){
Communicator ic = null;
int flag=2;
oaTerTemp = queryMerService.getNxyMerById(oaTerTemp.getId());// 获得查看的农信银商户信息
if (null == oaTerTemp) {
return ajaxDoneError("商户不存在!!!");
}else if(StringUtil.isTrimEmpty(oaTerTemp.getPsamNo())){
return ajaxDoneError("此商户未绑定psam卡!!!");
}
try {
//创建一个通信器的对象 ic
ic = Util.initialize();
/*
* 获取远程对象的代理
*创建通讯器的代理基类,并用通信器的 stringToProxy()方法初始化之.
*该代理使用的请求标识为 SimplePrinter, 端口号: 10000,协议:默认(TCP)
*/
ObjectPrx base = ic .stringToProxy("ServerIceZF:default -h 218.17.149.106 -p 10231");//这个ip和端口是写你需要调用的远程服务器的
ServerIceZFPrx serverIceZF = ServerIceZFPrxHelper.checkedCast(base);
if (serverIceZF == null){
throw new Error("Invalid ice");
}
PsamPrxHelper pp =(PsamPrxHelper) serverIceZF.resetPsam(oaTerTemp.getPsamNo());//这个是调用上述接口传参,然后获取返回值
if(pp!=null){
flag =pp.getResult();
}
} catch (Ice.LocalException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println(e.getMessage());
}finally{
if (ic != null) {
//通讯器必须初始化过,否则不能调用 destroy
try {
ic.destroy();//销毁通讯器
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
if(flag==0){
return ajaxDoneSuccess("psam卡解绑成功");
}else if(flag==1) {
return ajaxDoneError("psam卡解绑失败!!!");
}else{
return ajaxDoneError("psam卡解绑失败!!!");
}
}
6.web.xml文件配置
<servlet>
<servlet-name>ICESystemServlet</servlet-name>
<servlet-class>com.forwor.fwems.basemana.ICESystemServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
至此,一个可以使用的ice就搞定了,在这之前,你需要配置ice的环境和下载ice的jar包,这些网上很多;至于ice文件的编译,我用的是myeclipse,直接拷贝到slice文件夹里面,就会自动编译了。
由于是初次就出,有很多不足的地方欢迎各位大大指正,不胜感激,也希望能给初次接触的朋友带来方便