ice初用之一

       由于项目需要,这几天开始接触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文件夹里面,就会自动编译了。

由于是初次就出,有很多不足的地方欢迎各位大大指正,不胜感激,也希望能给初次接触的朋友带来方便


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值