thrift使用示例二

thrift使用示例二

1.thrift配置参考:

#定义生成代码的命名空间(与你需要定义的package相对应,其中"java"表示如果生产的是Java类,则会在指定的包下生成)
namespace java com.zhongying.thrift

#创建另一个名称类型(即对i32类型起别名,thrift中的i32对应java中的int,在下面如果要使用i32就可以直接用int代替了)
typedef i32 int

#接口一使用(获取行业信息)
#定义结构体,最终会像service一样生成一个Output类,可以当作一种数据类型使用
struct Output {
    1: map<string, string> values;       
}

#接口二使用(获取最终结果)
#定义结构体,最终会像service一样生成一个UserArray类,可以当作一种数据类型使用
struct UserArray {
	1: string userId;
	2: string userName;
	3: string userPhoneNumber;
	4: double allSumMoney;
	5: int allConsumeTimes;
	6: double allAvgMoney;
	7: string lastConsumeTime;
	8: string lastConsumeShop;
	9: string lastConsumeItem;
	10: list<string> tags;
}

#定义结构体,最终会像service一样生成一个UserResult类,可以当作一种数据类型使用
struct UserResult {
	1: int rsCount;
	2: list<UserArray> array;
}

#定义service,最终生成一个BakingManager接口类,类里面有需要自己手动实现的getOutput()、getCPList()方法
#你的业务逻辑代码需要实现代码生成的BakingManager.Iface接口
service BakingManager {
    Output getOutput(1:string id),
    UserResult getCPList(1:int pageSize, 2:int pageIndex, 3:list<string> sectorId, 4:list<string> areaId, 5:double fromSectorAvgMonery, 6:double toSectorAvgMoney, 7:double fromSectorSummoney, 8: double toSectorSumMoney),
}

2.生成的java类如下:

thrift使用示例二_第1张图片
最终生成gen-java文件夹,其下有个com.zhongying.thrift包,包中包含所生成的类(在这里面,我已经对其改造成了"source folder")。

OutPut、UserArray、UserResult与配置文件中的struct类型对应,表示一种数据类型;BankingManger与配置文件中的service对应,表示一个接口(需自己手写代码实现此接口)

3.编写实现类(实现BankingManager.Iface接口)

package com.zhongying.java;

import java.util.List;
import java.util.Map;

import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zhongying.ibatisImpl.CategoryImpl;
import com.zhongying.ibatisImpl.Tmp;
import com.zhongying.thrift.BakingManager;
import com.zhongying.thrift.Output;
import com.zhongying.thrift.UserResult;

/**实现BakingManager.Iface接口(该接口有两个方法)*/
public class BakingHandler implements BakingManager.Iface {
	private static final Logger LOGGER = LoggerFactory
			.getLogger(BakingHandler.class);

	private static int sum = 0;
	@Override
	public synchronized Output getOutput(String id) {
		//Map<String,String> map = new Category.getCategorys(id);//之前的jdbc实现代码
		Map<String,String> map = new CategoryImpl().getCategorys(id);
		Output output = new Output(map);//调用OutPut的构造方法把map改造为Output类型
		//LOGGER.debug("接口被调用:" + ++sum + "次");
		System.out.println("接口被调用:" + ++sum + "次");
		return output;
	}
	@Override
	public UserResult getCPList(int pageSize, int pageIndex,
			List<String> sectorId, List<String> areaId,
			double fromSectorAvgMonery, double toSectorAvgMoney,
			double fromSectorSummoney, double toSectorSumMoney)
			throws TException {
		UserResult result = new Tmp().getCPList(pageSize, pageIndex, sectorId,
				areaId, fromSectorAvgMonery, toSectorAvgMoney,
				fromSectorSummoney, toSectorSumMoney);
		// LOGGER.info("接口被调用:" + ++sum + "次");
		System.out.println("接口被调用:" + ++sum + "次");
		return result;
	}
}

4.上述实现接口的代码间接的调用了其他类中的对于getOuput和getCPList方法的具体实现,参考如下:

(1).getOutput方法实现:

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.zhongying.pojo.Category;

public class CategoryImpl {

private static SqlMapClient sqlMapClient = null;
	
	// 读取配置文件
	static {
		try {
			Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
			sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public Map<String,String> getCategorys(String catId) {
		List<Category> list = new ArrayList<Category>();
		try{
			list = sqlMapClient.queryForList("getCategorys",catId);
			Map<String,String> map = new HashMap<String,String>();
			for(Category cat : list){
				map.put(cat.getCatId(), cat.getCatName());
			}
			return map;
		}catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
}


(2).getCPList方法实现:

import java.util.ArrayList;
import java.util.List;

import com.zhongying.thrift.UserArray;
import com.zhongying.thrift.UserResult;

public class FianlResultTmp {

	public UserResult getCPList(int pageSize, int pageIndex, List<String> sectorId,
			List<String> areaId, double fromSectorAvgMonery, double toSectorAvgMoney,
			double fromSectorSummoney, double toSectorSumMoney) {
		UserResult result = new UserResult();
		result.setRsCount(35);
		List<UserArray> userArrays = new ArrayList<UserArray>();
		for(int i = 0; i < 10; i++){
			UserArray arr = new UserArray();
			   arr.setUserId("1001");
			   arr.setUserName("朱**");
			   arr.setUserPhoneNumber("187******93");
			   arr.setAllSumMoney(5060.0);
			   arr.setAllConsumeTimes(15);
			   arr.setAllAvgMoney(337.3);
			   arr.setLastConsumeTime("2013-2-16");
			   arr.setLastConsumeShop("无锡国美永乐店");
			   arr.setLastConsumeItem("微波炉、洗衣机、三星Cgalaxy 5");
			   List<String> tags = new ArrayList<String>();
			   tags.add("湘菜");
			   tags.add("婚纱馆");
			   tags.add("亲子旅游");
			   arr.setTags(tags);
			   userArrays.add(arr);
		}
		result.setArray(userArrays);
		return result;
	}
	
}

以上代码仅供本人参考,大家可能会看的很模糊,如果有兴趣可以下载本人的实现代码:

http://download.csdn.net/detail/u012875880/7057687






你可能感兴趣的:(thrift使用示例二)