最近刚开发了一个需求,使用ICE调用服务器端的接口,过程如下:
1 首先是准备环境,通过下载得到安装包,这次我用的是3.1版本(目前最新是3.4)
2 接着使用bin目录下slice2java将得到的ice文件转化为Java类,命令为slice2java ****.ice
3 将lib目录下Ice.jar引入Java工程内,开始编写客户端代码
public abstract class AbstractIceAgent { protected Logger logger = LoggerFactory.getLogger(AbstractIceAgent.class.getName()); private static final int DEFAULT_TIME_OUT = 2000; String identId; public AbstractIceAgent(){ } public AbstractIceAgent(String identId){ this.identId = identId; } public String getIdentId() { return identId; } public void setIdentId(String identId) { this.identId = identId; } public Object executeProxy(Object bean) { Communicator communicator = Ice.Util.initialize(); Object returnValue = null; try { ObjectPrx objPrx = communicator.stringToProxy(identId); objPrx.ice_timeout(DEFAULT_TIME_OUT); returnValue = methodAction(objPrx, bean); } catch (Exception e) { logger.error("execute proxy cause error:" + e); throw new RuntimeException(e); } finally { if (communicator != null) { try { communicator.destroy(); communicator = null; } catch (Exception e) { // do nothing } } } return returnValue; } /** * ice接口方法的定义 * * @param base */ abstract Object methodAction(ObjectPrx base, Object bean); }
这是一个虚基类,子类只需覆盖methodAction即可。
package ****; public interface AIMFriendBO { int[] isFriend(String memberId, String[] friendIds); }
这是本次需要实现的接口。
public class AIMFriendAgent extends AbstractIceAgent implements AIMFriendBO { // private static final String ICE_INTERFACE = "ADPushAgentId:default -h 10.2.225.50 -p 11001"; // private static BrmmsRemindAgent brmmsIceAgent = new BrmmsRemindAgent(ICE_INTERFACE); protected Logger logger = LoggerFactory.getLogger(AIMFriendAgent.class.getName()); private String strCaller; private String strServiceType; public void setStrCaller(String strCaller) { this.strCaller = strCaller; } public void setStrServiceType(String strServiceType) { this.strServiceType = strServiceType; } public AIMFriendAgent(){ }; public AIMFriendAgent(String identId){ super(identId); } @Override Object methodAction(ObjectPrx base, Object bean) { WWContactInterfacePrx ctWebInterfacePrx = WWContactInterfacePrxHelper.checkedCast(base); AliIMContact contact = (AliIMContact) bean; IntSeqHolder isFriendSeq=new IntSeqHolder(); StringHolder retMsgHolder=new StringHolder(); int result = ctWebInterfacePrx.IsFriend(strCaller, strServiceType, contact.getMemberId(), contact.getContactIds(), isFriendSeq, retMsgHolder); // 10000 means ok normally if(result==10000){ return isFriendSeq.value; }else{ logger.error("check contact error in AIMFriendAgent , cause :" + retMsgHolder.value); return null; } } public int[] isFriend(String memberId, String[] friendIds) { if (memberId == null||friendIds==null) { throw new RuntimeException("ice contact relation check parameters are empty"); } int[] returnValue=(int[]) this.executeProxy(new AliIMContact(memberId,friendIds)); return returnValue; } }
这是最后的实现,使用时只需在spring的配置文件中配好需要的参数即可直接使用。
参考文献:http://blog.csdn.net/linkyou/archive/2009/02/02/3858233.aspx