`
hanqunfeng
  • 浏览: 1543434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Thrift--JavaServer&PythonClient遇到的问题

 
阅读更多

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并不支持。

 

 

分享到:
评论

相关推荐

    maven-thrift-plugin-0.1.11.jar

    maven-thrift-plugin-0.1.11.jar

    thrift-0.9.1.exe和thrift-0.9.2.exe

    然后,通过运行`thrift-0.9.x.exe`,我们可以指定`.thrift`文件和目标语言,如Java、Python、C++等,生成相应的服务端和客户端代码。例如,在命令行中,我们可能会输入: ```bash thrift-0.9.x.exe --gen java my_...

    maven-thrift-server

    【 Maven-Thrift-Server:构建Thrift服务的Maven实践】 在软件开发中,Thrift是一种高效的跨语言服务开发框架,由Facebook开发并开源。它允许定义数据类型和服务接口,然后自动生成各种编程语言的代码,使得不同...

    spark-hive-thriftserver_2.11-2.1.3-SNAPSHOT-123456.jar

    spark-hive-thriftserver_2.11-2.1.spark-hive-thrift

    maven-thrift-plugin-0.1.11-sources.jar

    maven-thrift-plugin-0.1.11-sources.jar

    编译的spark-hive_2.11-2.3.0和 spark-hive-thriftserver_2.11-2.3.0.jar

    spark-hive_2.11-2.3.0...spark-hive-thriftserver_2.11-2.3.0.jar log4j-2.15.0.jar slf4j-api-1.7.7.jar slf4j-log4j12-1.7.25.jar curator-client-2.4.0.jar curator-framework-2.4.0.jar curator-recipes-2.4.0.jar

    maven-thrift-plugin-0.1.10

    maven插件 maven-thrift-plugin-0.1.10

    thrift-0.9.3.exe

    Thrift支持多种编程语言,包括但不限于Java、Python、C++、C#、PHP、Ruby等,这使得它成为构建分布式系统和微服务的理想工具。它的优点在于能够提供高效、轻量级的通信机制,同时降低跨语言开发的复杂性。通过使用...

    thrift-0.13.0.zip

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,现在是Apache软件基金会的项目。它的主要目标是通过定义一种中间语言(IDL,Interface Definition Language)来简化不同编程语言之间的通信,使得...

    Thrift-java学习小结

    Thrift是一种远程过程调用(RPC)框架,它通过定义一种中间描述文件(.thrift),可以生成多种编程语言的代码,如Java、Python、C++等。这种跨语言的能力使得开发多语言服务变得简单,同时Thrift还提供了一种轻量级...

    thrift-0.9.2.exe

    thrift开发时,将thrift文件自动生成java文件需要用到thrift-0.9.0.exe

    thrift-0.9.0.exe

    thrift开发时,将thrift文件自动生成java文件需要用到thrift-0.9.0.exe

    Laravel开发-thrift-laravel

    3. **多语言支持**:由于Thrift支持多种语言,使用Thrift-Laravel可以轻松地在Laravel应用和其他语言(如Java、Python、Go等)的应用之间建立通信。 四、部署与调试 1. **部署**:将Thrift-Laravel集成到Laravel...

    thrift-0.13.0.tar.gz

    这些定义可以被Thrift编译器转换为不同目标语言的代码,如Python、Java、C++等,这样你就可以在各种语言环境中使用相同的API来实现跨平台的通信。 Thrift的二进制通讯协议则优化了数据在网络中的传输效率。与传统的...

    thrift-0.9.1.exe和thrift-0.9.2.exe 含使用说明

    例如,你可以编写一个.thrift文件定义服务接口,然后使用thrift编译器生成Java、Python、C++、PHP等语言的代码,这些代码包含了客户端和服务端的实现。 在使用Thrift时,首先你需要了解其基本概念: 1. **IDL...

    thrift-python-java:一个简单的基于Java的Thrift Service服务器和一个Java&Python客户端

    cd java-server-client mvn test -Pserver 此命令将在端口9090上运行服务器 运行Java客户端 cd java-server-client mvn test -Pclient 运行Python客户端 首先,设置所需的依赖项 git clone ...

    thrift-0.9.0.tar.gz

    通过Thrift编译器,这个IDL文件会被转化为目标语言的代码,如C++, Java, Python等,这样开发者就可以在这些语言环境中直接使用生成的代码进行服务的实现和调用。 Thrift的核心特性包括: 1. **数据序列化**:Thrift...

    thrift-0.9.2.tar.gz

    thrift,Apache Thrift 0.9.2 版本,解压后直接直接安装,可伸缩的跨语言服务开发框架,命令: 解压命令:tar -zxf thrift-0.9.2.tar.gz 安装命令:./configure --with-lua=no && make && make install 查看版本:...

    maven-thrift-client

    【 Maven 和 Thrift 的结合:maven-thrift-client】 在软件开发中,Thrift 是一个强大的跨语言服务开发框架,由 Facebook 开发并开源。它允许开发者定义服务接口和服务数据类型,然后自动生成多种编程语言的客户端...

    thrift-0.10.0.exe

    它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。...

Global site tag (gtag.js) - Google Analytics