apache Thrift如何优化java服务端代码(实现一个服务端可调用多个实现类)
最近使用了Thrift框架实现java远程方法调用,但是发现不怎么好扩展,
第一个问题,怎么实现多个接口?
第二个问题Thrift都是靠.thrift文件生成java接口代码,可不可以继承减少重复代码?
我的代码实现,服务端
服务端 public class RPCService implements Runnable { // 注册端口 public static final int SERVER_PORT = 6543; public void start() { new Thread(new RPCService()).start(); } @Override public void run() { // TODO Auto-generated method stub try { TNonblockingServerSocket socket = new TNonblockingServerSocket(SERVER_PORT); final IContentService.Processor<IContentService.Iface> processor = new IContentService.Processor<IContentService.Iface>(new ContentRpcImpl()); THsHaServer.Args arg = new THsHaServer.Args(socket); // 高效率的、密集的二进制编码格式进行数据传输 // 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO arg.protocolFactory(new TCompactProtocol.Factory()); arg.transportFactory(new TFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server = new THsHaServer(arg); System.out.println("使用非阻塞,高效二进制编码通信."); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
现在服务类已经搞好,问题是下面这段代码,这里是写死的,如果接口实现类(ContentRpcImpl)不止这一个,那如何扩展?总不能写一个接口创建一个服务端吧?跪求大神的如何解决这个问题。
final IContentService.Processor<IContentService.Iface> processor = new IContentService.Processor<IContentService.Iface>(new ContentRpcImpl());
客户端代码:
public static final String getRemoveData(int page,int rows){ try { TTransport transport = new TFramedTransport(new TSocket("localhost", 6543, 30000)); // 协议要和服务端一致 TProtocol protocol = new TCompactProtocol(transport); IContentService.Client client = new IContentService.Client(protocol); transport.open(); String data=client.getContentList(page, rows); transport.close(); return data; } catch (TTransportException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
第一个问题: 使用TMultiplexedProcessor可以解决.
第二个问题: 可以手动优化thrift生成的java代码,比如删除重复代码.但这样做的弊端就是如果idl修改,再次生成java代码,那就要重新优化.
按理说,自动生成代码使用模板方式会更好,.但可惜的是thrift没有这么干,而是硬编码拼出来的,所以通过idl优化代码的空间极为有限.
模板模式,把重复的代码抽出来当个模板。