codegen-thrift 是最近我完成的一个java代码生成程序,实现从普通接口类型生成基于thrift/swift框架的service/client 端封装java代码.这个工具可以让你在不修改现有的接口定义的情况下,自动生成基于现有接口的thrift service /client代码,实现client端通过网络对服务端接口的透明调用。

支持byte[],Date,float,Float,URI,URL类型的自动转换.

执行 java -jar target/codegen-thrift-1.0.0-SNAPSHOT-standalone.jar -help 显示运行参数说明.
参数说明

-ic,--interface-class 要生成thrift代码的接口类名     -rc,--reference-class 实现interface-class接口的一个类名(可选),如果不指定,生成的接口方法中参数名为arg1,arg2...      -p,--package <arg> 输出代码的包名     -o,--output <arg> 代码输出位置     -gt,--task-type 生成代码的类型:CLIENT,SERVICE

下面以thrift.test.original.TestInterface类为例,说明代码生成的过程

生成service端代码

java -jar target\codegen-thrift-1.0.0-SNAPSHOT-standalone.jar ^
    -ic thrift.test.original.TestInterface ^ 
    -rc thrift.test.original.TestInterface$BaseImpl ^
    -p thrift.test.service ^
    -o J:\codegen\codegen-thrift\src\test\java ^
    -gt SERVICE

生成代码中https://gitee.com/l0km/codegen/blob/master/codegen-thrift/src/test/java/thrift/test/service/TestInterfaceThriftDecorator.javathrift.test.original.TestInterface对应thrift service端实现类。

生成thrift client代码

生成IDL文件

gen-thrift.bat

https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-thrift.bat

生成thrift client端数据类型及接口定义

gen-client.bat

https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-client.bat

生成 client代码:

java -jar target\codegen-thrift-1.0.0-SNAPSHOT-standalone.jar ^
    -ic thrift.test.original.TestInterface ^
    -rc thrift.test.original.TestInterface$BaseImpl ^
    -p thrift.test.client ^
    -o J:\codegen\codegen-thrift\src\test\java ^
    --thrift-package thrift.test.client.thrift ^
    -gt CLIENT

生成的代码中https://gitee.com/l0km/codegen/blob/master/codegen-thrift/src/test/java/thrift/test/client/TestInterfaceThriftClient.javathrift.test.original.TestInterface接口对应的 thrift client端实现。

启动服务

因为已经基于TestInterface接口自动生成了对应的service服务实现TestInterfaceThriftDecorator,所以将一个TestInterface接口实例启动为thrift服务就非常简单了:

InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
    ThriftServerService service = ThriftServerService.bulider()
            .withServices(new TestInterfaceThriftDecorator(new TestInterface.BaseImpl()))
            .setServerPort(32232)
            .build();
    service.startAsync();

client 端创建thrift 接口实例

因为client的TestInterfaceThriftClient基于thrift框架实现了TestInterface接口,只要创建了TestInterfaceThriftClient实例,就可以像普通的接口实例一样调用,网络传输,数据类型转换等工作都由TestInterfaceThriftClient自动完成。

// TestInterface 的thrift client实例
    TestInterface clientInstance = ClientFactory
            .builder()
            .setHostAndPort("127.0.0.1",32232)
            .build(TestInterface.class,TestInterfaceThriftClient.class);
    // 调用接口
    clientInstance.test(null,null,null);

生成代码的依赖

<dependency>
    <groupId>com.gitee.l0km</groupId>
    <artifactId>common-thrift</artifactId>
    <version>1.0.3-SNAPSHOT</version>
</dependency>

依赖库git仓库https://gitee.com/l0km/common-java/tree/master/common-thrift

thrift/swift:codegen-thrift java代码生成器的更多相关文章

  1. thrift:swift 命令行生成 IDL文件及Client java代码过程

    swift是一个用于创建thrift序列化类型和服务的java工具库,使用swfit可以生成非常简洁的java代码。使用swift提供的工具,可以直接生成IDL,再用IDL生成其他语言的client端代码(java,cpp,python…)下面的TestService.java定义了一个简单的服务接口,本文以实例的例子说明将这个服务接口生成thriftclient端代码的过程:TestService.javaTestBean.java下载Swift2ThriftCodeGenerator我们首先要从Tes

  2. thrift/swift/nifty:获取客户端ip的简单方法

    如下,所有的文章讲到的都是这两种方法。《两种方式获取Thrift调用的客户端IP地址》虽然没有再深入研究,但我想如果用thrift这应该是正确的办法。研究了Niffy代码发现,获取客户端IP相当简单,示例如下:另附上基于nifty的thriftserver初始化代码片段

  3. thrift/swift:ThriftMethodProcessor代码分析

    thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。比如对于null,虽然在java中定义一个字段为Integer类型,那么这个字段就可以为null,但thrift不允许primitive类型的数据字段为null,因为在c/c++的struct的字段中没有null的概念。做为方法的参数传递,primitive类型也是同样的道理。

  4. thrift/swift:对swift2thrift-generator-cli IDL生成工具的改进

    swift2thrift-generator-cli是thrift/swift提供的一个IDL文件命令行生成工具,它可以根据一个java服务接口类生成对应的IDL文件。手工解决办法当然有,地球人都知道的,手工解决办法很简单在服务方法或类定义时加上requiredness.OPTIONAL定义,告诉swift2thrift-generator-cli这个字段是可选的。从IDL生成工具swift2thrift-generator-cli入手改造它!

  5. thrift/swift:服务端数据类型和client端数据类型之间的直接转换

    需求描述我们知道,thrift/swift框架中,服务端的数据类型与client的类型是相互独立的,比如服务端有一个ClassA类型,到了client端,同样也会生成一个同名的类。那么当我们希望client端应用程序与服务端共用同一个数据类型,也就是服务端的ClassA时,就需要一种从clientClassA到服务端ClassA之间的直接转换,thrift/swift框架并没有提供这样的直接转换机制,该怎么办呢?解决方案首先需要找到thrift/swift将数据对象转换成数据流的地方。

  6. thrift/swift:codegen-thrift java代码生成器

    生成thriftclient代码生成IDL文件https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-thrift.bat生成thriftclient端数据类型及接口定义https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-client.bat生成client代码:生成的代码中https://gitee.com/l0km/codegen/blob/master/code

  7. 解决Mac安装thrift因bison报错的问题

    今天小编就为大家分享一篇解决Mac安装thrift因bison报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  8. Ubuntu Debian Linux快速安装Thrift

    获取Thrift源去ApacheThrift官方网站:https://thrift.apache.org/download:点击tar.gz的包下载链接进入:复制上图其中一个红框中的地址到浏览器:进入debian目录:一个完整的源目录至少包含dists和pool两个目录,否则都是无效的源,进入dist目录:这些就是Thrift的版本,0.9.3正好是我需要的。继续点进去有InReleaseRele

  9. php – 是否可以在常规Web服务器上使用Apache Thrift?

    我已经有一个我支付的网络服务器,我想使用Thrift和PHP公开一些服务.我的问题是:我可以使用正常的PHP托管在默认端口运行Thrift服务器,而不是在一些时髦的晦涩端口上运行单独的程序.这样我就不必更改服务器配置.谢谢编辑:也许我应该澄清一点.一旦我使用.thrift文件定义了我的服务,是否可以:>运行节俭代码生成器>把生成的代码放在我的web服务器上>创建一个index.PHP,它说(伪代码)“创建一个新的服务实例,并处理传入的请求”?

  10. Centos7.2 thrift-0.9.3 安装使用cpp服务端,go客户端

    thrift是什么依赖条件thrift安装thrift使用总结thrift是什么依赖条件thrift安装1.到http://thrift.apache.org/download这里下载的是thrift-0.9.3.tar.gz2.在执行下列操作,可根据需要选择相应的语言支持在终端输入:thrift–version查看是否安装成功。thrift使用定义一个thrift文件,phone.thrift,

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部