thrift在java中的应用参考:http://hanqunfeng.iteye.com/blog/1936556
thrift在python中的应用参考:http://hanqunfeng.iteye.com/blog/1945208
Contact.thrift
namespace java thrift.service struct Book{ 1:i32 id 2:string name } struct Contact{ 1:i32 id 2:string name 3:i64 birthday 4:string phoneNo 5:string ipAddress 6:map<string,string> props 7:double salary 8:set<Book> books } service ContactManager{ void save(1:Contact contact) void remove(1:i32 id) list<Contact> getAll(); list<Contact> query(1:map<string,string> conditions) }
生成java文件:
thrift --gen java Contact.thrift
生成python文件:
thrift --gen py Contact.thrift
java服务器端参考:http://hanqunfeng.iteye.com/blog/1936556
package thrift.service.impl; import java.util.List; import java.util.Map; import org.apache.thrift.TException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import thrift.dao.ContactManagerDao; import thrift.service.Contact; import thrift.service.ContactManager; @Service public class ContactManagerImpl implements ContactManager.Iface{ private static Logger logger = Logger.getLogger(ContactManagerImpl.class); @Override public void save(Contact contact) throws TException { // TODO Auto-generated method stub logger.info("ContactManagerDao save run"); } @Override public void remove(int id) throws TException { // TODO Auto-generated method stub logger.info("ContactManagerDao remove run"); } @Override public List<Contact> getAll() throws TException { // TODO Auto-generated method stub logger.info("ContactManagerDao getAll run"); List<Contact> list = new ArrayList<Contact>(); Book book = new Book(); book.setId(10); book.setName("西游记"); Book book2 = new Book(); book2.setId(11); book2.setName("水浒传"); Contact contract = new Contact(); contract.setBirthday(100000000); contract.setId(101); contract.setIpAddress("192.168.0.101"); contract.setName("超人"); contract.setPhoneNo("13312345678"); contract.setSalary(98456.36); Set<Book> set = new HashSet<Book>(); set.add(book); set.add(book2); contract.setBooks(set); list.add(contract); logger.info(list.toString()); return list; } @Override public List<Contact> query(Map<String, String> conditions) throws TException { // TODO Auto-generated method stub logger.info("ContactManagerDao query run"); logger.info(conditions.toString()); List<Contact> list = new ArrayList<Contact>(); Contact contract = new Contact(); contract.setBirthday(100000000); contract.setId(101); contract.setIpAddress("192.168.0.101"); contract.setName("超人"); contract.setPhoneNo("13312345678"); contract.setSalary(98456.36); list.add(contract); Contact contract2 = new Contact(); contract2.setBirthday(200000000); contract2.setId(101); contract2.setIpAddress("192.168.0.102"); contract2.setName("超人2"); contract2.setPhoneNo("13312345672"); contract2.setSalary(98456.32); list.add(contract2); return list; } }
python客户端参考:http://hanqunfeng.iteye.com/blog/1945208
# coding=utf-8 ''' Created on 2013-9-22 @author: hanqunfeng ''' import sys sys.path.append('../') #导入上下文环境 from servicePy import ContactManager from thrift import Thrift from thrift.transport import TSocket from thrift.transport import TTransport # from thrift.protocol import TBinaryProtocol from thrift.protocol import TCompactProtocol def hiveExe(): try: transport = TSocket.TSocket('127.0.0.1', 7912) transport = TTransport.TBufferedTransport(transport) # protocol = TBinaryProtocol.TBinaryProtocol(transport) protocol = TCompactProtocol.TCompactProtocol(transport) client = ContactManager.Client(protocol) transport.open() print "The return value is : " print client.remove(12) list = client.query({'a':'韩群峰','b':'hello world'}) print list for m in list: print m print m.salary print m.name print m.birthday print "............" transport.close() except Thrift.TException, tx: print '%s' % (tx.message) if __name__ == '__main__': hiveExe()
问题:
这里,客户端调用query()方法,会正常得到输出:
[Contact(salary=1.900218491772795e-109, name='\xe8\xb6\x85\xe4\xba\xba', birthday=100000000, books=None, props=None, ipAddress='192.168.0.101', id=101, phoneNo='13312345678'), Contact(salary=-5.965150887436158e+213, name='\xe8\xb6\x85\xe4\xba\xba2', birthday=200000000, books=None, props=None, ipAddress='192.168.0.102', id=101, phoneNo='13312345672')]
但是,如果客户端调用getAll()方法会抛异常,TypeError: unhashable instance,提示类型不能转换,所以形如:
[Contact(id:101, name:超人, birthday:100000000, phoneNo:13312345678, ipAddress:192.168.0.101, props:null, salary:98456.36, books:[Book(id:11, name:水浒传), Book(id:10, name:西游记)])]
这样复杂的数据类型,python并不支持。